Начиная с проблемы, которая возникла у меня в коде, я создал это простое приложение, чтобы воссоздать проблему:
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
. Действительно, у меня есть предупреждающее сообщение от Visual Studio, которое сообщает мне, что я не жду метода. Однако решение компилируется, и я боюсь, что это может произойти где-то еще в моем коде, если я широко использую async/await. Итак, не могли бы вы объяснить причину и указать какое-то золотое правило, чтобы избежать этого?
P.S.: Работает, если в коде для button1_Click
написать:
Task task = Task.Run(async () =>
{
await TestWork();
});
button1_Click
— этоTask.Run(() => TestWork())
. - person svick   schedule 05.06.2012