呼び出しの進行中に GUI がフリーズしないようにするために、(BackgroundWorker を使用して) WCF 呼び出し用のある種のラッパーを作成しています。ほとんど正常に動作していますが、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フォームで例外をキャッチしたいと思います。