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

时间:2013-10-01 22:13:59

标签: c# debugging backgroundworker

以下是我正在使用的代码:

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()它仍然没有单步执行。

3 个答案:

答案 0 :(得分:4)

尝试在Console.Readline();之前添加mainWorker.Dispose();。在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代码。

答案 1 :(得分:0)

同时检查可能退出主线程的异常。

答案 2 :(得分:0)

我发现为了抛出异常以便我可以通过在后台工作线程中运行的代码进行调试,我需要打开&#34;启用Just My Code&#34;在工具=&gt;选项=&gt;调试=&gt;一般=&gt;启用我的代码。

然后确保在Debug =&gt;中例外&#34;公共语言运行时例外&#34;复选框检查Thrown和User-unhandled exception。