尝试在调试中步进BackgroundWorker代码,但程序意外结束

4

这是我正在使用的代码:

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块中设置了一个断点。有时它会触发断点,但是在执行一定数量的代码行之后程序就会结束。它并不总是在同一行代码结束,有时根本不会打断点。
如果我删除后台worker,代码会正常执行。
我以前没有实现过BackgroundWorker,现在我正在尝试弄清楚我错过了什么导致我不能逐步执行我的代码。
编辑: 忘了提到,即使我注释掉Dispose()也无法逐步执行。

它是控制台应用程序还是WinForms? - Dmitrii Dovgopolyi
这是一个控制台应用程序。 - Krondorian
3个回答

5
尝试在 mainWorker.Dispose(); 之前添加 Console.Readline();。可能是因为应用程序在 BackgroundWorker 执行其工作之前停止。

BackgroundWorker 作为后台线程运行,因此如果主线程停止,则会终止该线程。

您可以在简单的示例上进行测试。此代码仅显示一个数字。

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 中的评论后,我想确认一下我的项目输出类型,结果发现它实际上并没有设置为控制台。将输出类型设置为控制台后,现在可以正确地执行步骤了! - Krondorian
那么如果我在ASP.NET MVC控制器中尝试使用BackgroundWorker,后台线程会不可预测地终止,对吗? - Bill Greer

2
我发现,为了使我能够通过在后台工作线程中运行的代码进行调试抛出异常,我需要在“工具= > 选项= > 调试= > 一般= > 启用仅我的代码”中打开此功能。
然后,请确保在“调试= > 异常”中,对于“公共语言运行时异常”,已选中“抛出”和“用户未处理”的复选框。

0

还要检查可能中断主线程的异常。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接