从一个问题,我对我的代码开始,我创建了这个简单的应用程序来重现问题:
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中通知我,我不会等待的方法的警告消息。 然而该解决方案编译和我很害怕这会在我的代码在其他地方发生,如果我用大量的异步/ AWAIT。 所以,可以请你说明理由,并peraphs给一些金科玉律避免呢?
PS:它的工作原理,如果在代码button1_Click
我写的:
Task task = Task.Run(async () =>
{
await TestWork();
});