我认为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。
如何正确处理此异常。
答案 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。