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

本文关键字:代码 程序 结束 意外 BackgroundWorker 执行 调试 单步 | 更新日期: 2023-09-27 18:33:27

这是我正在使用的代码:

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(),它仍然没有通过。

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

尝试在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代码。

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

然后,确保在"调试 => 异常"中,选中"公共语言运行时异常"复选框以查找"引发"和"用户未处理的异常"。

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

相关文章: