【问题标题】:Trying to step through BackgroundWorker code in debug but program ends unexpectedly尝试在调试中单步执行 BackgroundWorker 代码,但程序意外结束
【发布时间】:2014-10-14 17:00:48
【问题描述】:

这是我正在使用的代码:

try
{
    mainWorker = new BackgroundWorker();
    mainWorker.DoWork += (sender, e) =>
    {
        try
        {
            //stuff I want to have happen in the background
            ...
            //I want to step through the lines in this try block
        }
        catch
        {
            //exception not being caught
        }
    };
    mainWorker.RunWorkerCompleted += (sender, e) =>
    {
        //code to let user know that the background work is done
         ...
    };
    mainWorker.RunWorkerAsync();
    mainWorker.Dispose();
}
catch
{
    //exception not being caught
}

我没有看到任何异常被抛出。我在 DoWork 的 try 块内设置了一个断点。有时它会遇到断点,但在单步执行一定数量的行之后,程序就会结束。它并不总是以同一行代码结束。有时它根本没有达到断点。

如果我消除后台工作人员,代码将正常执行。

我之前没有实现过后台工作人员,我正在尝试找出我缺少的东西,这导致我无法单步执行我的代码。

编辑:忘了提到,如果我注释掉 Dispose() 它仍然不会通过。

【问题讨论】:

  • 是控制台应用还是winforms?
  • 这是一个控制台应用程序

标签: c# debugging backgroundworker


【解决方案1】:

尝试在mainWorker.Dispose(); 之前添加Console.Readline();。您的应用程序可能在 BackgroundWorker 完成其工作之前停止。

BackgroundWorker 以background thread 运行,所以如果主线程停止,它就会终止。

您可以通过简单的示例对其进行测试。此代码将只显示一个数字。

static void Main(string[] args)
{
    BackgroundWorker mainWorker = new BackgroundWorker();
    mainWorker.DoWork += (sender, e) =>
        {
            for (int i = 0; i < 5; i++)
            {
                Console.WriteLine(i);
                Thread.Sleep(500);
            }
        };
    mainWorker.RunWorkerAsync();
}

但是,如果您通过Console.Readline(); 添加停止主线程,您将拥有所有数字,并且可以在调试中单步执行DoWork 代码。

【讨论】:

  • 在您提到这一点并在我的 OP 中查看您的评论后,我想确认我的项目的输出类型,毕竟它没有设置为控制台。将输出类型设置为控制台后,现在可以正常执行了!
  • 因此,如果我在 ASP.NET MVC 控制器中尝试使用后台工作线程,后台线程将会意外终止,对吗??
【解决方案2】:

我发现为了抛出异常以便我可以通过在后台工作线程中运行的代码进行调试,我需要在工具 => 选项 => 调试 => 常规 => 启用中打开“仅启用我的代码”只是我的代码。

然后确保在 Debug => Exceptions 中选中“Common Language Runtime Exceptions”复选框以检查抛出的和用户未处理的异常。

【讨论】:

    【解决方案3】:

    还要检查可能退出主线程的异常。

    【讨论】:

      猜你喜欢
      • 2018-07-17
      • 2019-03-16
      • 2021-09-27
      • 1970-01-01
      • 1970-01-01
      • 2014-06-07
      • 1970-01-01
      • 2011-05-05
      相关资源
      最近更新 更多