私の理解では、Windows フォーム アプリケーションでは、UI スレッドが例外をスローし、それがユーザー コードによって処理されない場合、アプリケーションはユーザーに明らかな方法でクラッシュします。(アプリケーションがクラッシュしたか、ウィンドウがフリーズするか、またはその両方であることを示すメッセージが画面に表示されます)
ここで、次のコードを検討してください。
try
{
PerformAsyncOperation();
while(!async_op_complete)
{
Application.DoEvents();
}
}
catch
{
Print("exception");
}
私の理解では、Windows フォームには同期コンテキストがあるため、非同期操作 (ちなみに、.net 4.5 については話していません) は、制御がイベント ハンドラー プロシージャを離れるまで実行されません。それが発生すると、UI スレッド内で非同期コードが実行されます。そのコードが例外をスローした場合、非同期メソッドの呼び出しを囲む try-catch ステートメントによってキャッチされません。これは、例外がスローされるまでに制御がその try-catch ステートメントをすでに離れているためです。
ただし、上記のような場合、ループしているという事実は、制御が UI スレッド内に残っていることを意味し、ループ内で Application.DoEvents() を呼び出しているという事実は、非同期操作が内部で「非同期的に」実行されることを意味します。 UI スレッド。また、そのループは try 句内で発生するため、async メソッドによってスローされた例外は、対応する catch 句によってキャッチされます。(少なくともこれは私が観察した動作です。)
そうは言っても、
同じ UI スレッド内でさらに作業を行う前に、非同期操作が完了するのを待っている間に UI の応答性を維持するために、ループ内で Application.DoEvents() を呼び出すことは良い考えですか?
ループ内で Application.DoEvents() を呼び出すのは良い考えではありませんが、PerformAsyncOperation() によってスローされた例外を catch 句が処理した後、アプリケーションが静かに終了する (ウィンドウがフリーズせず、エラー メッセージも表示されない) のはなぜでしょうか?