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 块内设置了一个断点。有时它会遇到断点,但在单步执行一定数量的行之后,程序就会结束。它并不总是以同一行代码结束。有时它根本没有达到断点。

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

我之前没有实现过后台工作人员,我正在试图找出我错过了什么阻止我单步执行我的代码。

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

4

3 回答 3

5

尝试添加Console.Readline();之前mainWorker.Dispose();。您的应用程序可能在 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在调试中单步执行代码。

于 2013-10-01T22:25:58.707 回答
2

我发现为了抛出异常以便我可以通过在后台工作线程中运行的代码进行调试,我需要在 Tools => Options => Debugging => General => Enable Just My Code 中打开“仅启用我的代码” .

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

于 2014-10-14T09:00:48.320 回答
0

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

于 2014-06-13T08:53:14.290 回答