我是否正确忽略编译器警告缺少等待此异步调用?

Nil*_*zor 30 c# async-await windows-runtime windows-store-apps

我在Metro应用程序的一部分中发生异常时触发了以下方法

void Model_ExceptionOccured(Exception ex)
{
    var dlg = new Windows.UI.Popups.MessageDialog("An exception occured during verification: " + ex.Message, "Exception");
    dlg.ShowAsync();
}
Run Code Online (Sandbox Code Playgroud)

'dlg.ShowAsync()' - 调用是异步的,但我不在乎等待结果.编译器会为它生成警告:

Because this call is not awaited, execution of the current method continues before the call is completed. Consider applying the 'await' operator to the result of the call.

我应该关心吗?有什么理由我应该添加await关键字,除了摆脱警告?

小智 28

根据以下链接,alexm给出的答案是不正确的.在等待的异步调用期间抛出的异常将丢失.要消除此警告,您应该将异步调用的Task返回值分配给变量.这可确保您可以访问抛出的任何异常,这些异常将在返回值中指示.

http://msdn.microsoft.com/en-us/library/hh965065(v=vs.110).aspx(VB.NET)

http://msdn.microsoft.com/en-us/library/hh873131.aspx(C#)


ale*_*exm 6

问题是,如果dlg.ShowAsync();抛出异常的代码将保持未处理状态,并且稍后将被Finalizer线程重新抛出,可能导致程序终止.

实际发生的事情取决于.NET异常策略

MSDN上的这篇文章提到了这一点:

如果您不等待传播异常的任务或访问其Exception属性,则在对任务进行垃圾回收时,将根据.NET异常策略升级异常.

最终发布VS 2012时,未处理任务异常的默认策略从终止进程更改为忽略异常.