それで、私はこの問題の原因を発見しました-というか、友人が説明しました:
JIT デバッグが無効になっていると、実行が正しく流れているように見えても、スレッド間で例外をキャッチすることはできません。
Form.Closing イベント ハンドラーで例外がスローされていました。
form.Closing += new delegate
{
switch(form.DialogResult)
{
case DialogResult.OK:
// do stuff;
break;
case DialogResult.Cancel:
throw new AbortOperationException();
}
}
// ...
try
{
mainForm.Invoke(new Function<Form, DialogResult>(form.ShowDialog), mainWindow);
}
catch (AbortOperationException)
{
// handle abort
}
解決策は、以下を排除するためにわずかにリファクタリングすることでしたthrow
。
form.Closing += new delegate
{
if (form.DialogResult == DialogResult.OK)
{
// do stuff
}
}
// ...
var result = (DialogResult)mainForm.Invoke(new Function<Form, DialogResult>
if (result == DialogResult.Cancel)
{
// handle abort
}