在try catch块中没有捕获await块内生成的异常

时间:2015-02-09 15:39:40

标签: c# exception asynchronous try-catch async-await

我有一个同步功能,例如以下函数产生IO错误(我删除了细节以简化):

public override void SyncFunction()
{
   throw new IOException("test");
}

我以这种方式使用它:

try
{
    await Task.Run(() => this.SyncFunction());
}
catch (Exception ex)
{
    MessageBox.Show("Error:"+Environment.NewLine + ex.Message);
}

但是当我运行应用程序时,catch块没有被调用,但是我收到一条消息,表明应用程序崩溃了。有什么问题,我该如何解决?

1 个答案:

答案 0 :(得分:2)

你所描述的代码应该处理异常就好了。

然而, 会使您的应用程序崩溃的事情是async void方法中抛出的异常,因为异常没有Task存储在其中。

所以,我的猜测是SyncFunction看起来更像是这样:

public override async void SyncFunction()
{
    throw new IOException("test");
}

当你调用它时,异常会发布到ThreadPool线程并导致应用程序崩溃。

如果是这种情况,请不要使用async void,除非在UI事件处理程序中,并确保通过注册AppDomain.CurrentDomain.UnhandledException事件来处理此类异常。