コードで発生した問題から始めて、問題を再現するためにこのシンプルなアプリを作成しました。
private async void button1_Click(object sender, EventArgs e)
{
Task task = Task.Run(() =>
{
TestWork();
});
try
{
await task;
MessageBox.Show("Exception uncaught!");
}
catch (Exception) { MessageBox.Show("Exception caught!"); }
}
private async void button2_Click(object sender, EventArgs e)
{
Task task = TestWork();
try
{
await task;
MessageBox.Show("Exception uncaught!");
}
catch (Exception) { MessageBox.Show("Exception caught!"); }
}
private async Task TestWork()
{
throw new Exception();
}
のコードbutton1_Click
は例外をキャッチしません。TestWork
これは、 asyncメソッドを待っていないためであることを確認しました。実際、Visual Studioから、メソッドを待っていないことを通知する警告メッセージが表示されます。ただし、ソリューションがコンパイルされ、async / awaitを広範囲に使用すると、コード内のどこかでこれが発生する可能性があるのではないかと心配しています。それで、理由を説明してください、そして、peraphsはそれを避けるためにいくつかの黄金のルールを与えますか?
PS:button1_Click
私が書いたコードで次の場合に機能します:
Task task = Task.Run(async () =>
{
await TestWork();
});