我正在编写一种WCF调用的包装器(使用BackgroundWorker),以保持GUI在调用正在进行时不会冻结。它通常能够正常工作,但是我在BackgroundWorker出现问题,特别是当WCF调用引发异常时。如果DoWork中出现异常,我可以在RunWorkCompleted中检测到它,但是重新抛出到GUI并不起作用。我已经阅读了许多关于这应该如何工作的线程。
下面是包装器的代码(请注意,WCF调用由抛出的异常表示):
下面是包装器的代码(请注意,WCF调用由抛出的异常表示):
private void GetSomething(Action<IEnumerable<int>> completedAction)
{
BackgroundWorker b = new BackgroundWorker();
b.DoWork += (s, evt) => { throw new Exception(); evt.Result = new List<int> { 1, 2, 3 }; };
b.RunWorkerCompleted += (s, evt) =>
{
if (evt.Error == null && completedAction != null)
{
completedAction((IEnumerable<int>)evt.Result);
}
else if(evt.Error != null)
{
throw evt.Error;
}
};
b.RunWorkerAsync();
}
在 Windows 表单中调用代码:
private void button3_Click(object sender, EventArgs e)
{
try
{
GetSomething(list =>
{
foreach (int i in list)
{
listView1.Items.Add(new ListViewItem(i.ToString()));
}
});
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
在调试过程中,我收到了以下信息:
- 在DoWork中抛出了“System.Exception”类型的异常
- 在throw evt.Error处抛出了“System.Exception”类型的异常
- 在Main方法中的Application.Run(new Form1())处未处理“TargetInvocationException”异常
我做错了什么?我想在Windows窗体中捕获异常。