如何处理BackgroundWorker处理程序中引发的异常?

时间:2011-08-19 01:56:52

标签: backgroundworker

我认为BackgroundWorker对象会捕获并将DoWork处理程序中引发的异常传递给RunWorkerCompleted hanlder,但它不会发生在我的程序中。

我创建了以下小程序来说明问题。创建了wpf应用程序。
    public partial class MainWindow:Window     {         public MainWindow()         {             的InitializeComponent();             ExecBackgrpundWorker();         }

    public void ExecBackgrpundWorker()
    {
        var bw = new BackgroundWorker();
        bw.DoWork += new DoWorkEventHandler(bw_DoWork);
        bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);


        bw.RunWorkerAsync();
    }

    void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        try
        {
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

    void bw_DoWork(object sender, DoWorkEventArgs e)
    {
        throw new NotImplementedException("Do Work Exception");
    }
}

bw_DoWork中引发的异常永远不会传递给bw_RunWorkerCompleted。

如何正确处理此异常。

3 个答案:

答案 0 :(得分:1)

异常由后台线程捕获,并分配给RunWorkerCompleted的RunWorkerCompletedEventArgs参数的“Error”属性。

答案 1 :(得分:0)

它永远不会成为“RunWorkerCompleted”处理程序。 它默默地失败了。

我的示例是检查Active Directory以获取安全组列表。 我输入了一个无效的域来测试错误处理......无声。

答案 2 :(得分:0)

将您的代码更改为:

public void ExecBackgrpundWorker()
{
    var bw = new BackgroundWorker();
    bw.DoWork += new DoWorkEventHandler(bw_DoWork);
    bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);


    bw.RunWorkerAsync();
}

void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    if(e.Error != null)
    {
        MessageBox.Show(e.Error.Message);
    }
}

void bw_DoWork(object sender, DoWorkEventArgs e)
{
    throw new NotImplementedException("Do Work Exception");
}

如果您调试并获取用户代码无法使用Exception,请单击继续,然后您将到达bw_RunWorkerCompleted。当您将代码作为发行版运行时,它将始终到达bw_RunWorkerCompleted。