我正在为 WCF 调用(使用 BackgroundWorker)编写某种包装器,以防止 GUI 在调用过程中冻结。它主要按应有的方式工作,但是当 WCF 调用引发异常时,我遇到了 BackgroundWorker 的问题。如果 DoWork 中发生异常,我可以在 RunWorkCompleted 中检测到它,但将其重新扔到 GUI 中不起作用。我读过很多帖子,有人提到这应该有效。
包装器的代码(注意 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 表单中捕获异常。