0

我在这段代码中有一个问题:

 try { await DoSomethingAsync(); }
 catch (System.UnauthorizedAccessException)
 { 
     ResourceLoader resourceLoader = new ResourceLoader();
     var accessDenied = new MessageDialog(resourceLoader.GetString("access_denied_text"), resourceLoader.GetString("access_denied_title"));
     accessDenied.ShowAsync();                            
 }

不可能写 await accessDenied.ShowAsync(); 因为 Visual Studio 将其视为错误:在 Catch 正文中禁止等待。但是没有等待的代码也不起作用。它无法捕获异常和应用程序崩溃。

无论如何,我需要同步显示这个对话框,因为此时我需要停止运行一会儿。那么,如何做到这一点呢?

4

1 回答 1

1

通常有一些方法可以重写代码以在 catch 块之外进行异步调用。至于不允许的原因,请查看这个 SO answer。将其移出catch块并添加await基本上会使其“同步”。

所以,虽然它看起来很丑,但它应该是这样的:

bool operationSucceeded = false;
try 
{ 
    await DoSomethingAsync(); 

    // in case of an exception, we will not reach this line
    operationSucceeded = true;    
}
catch (System.UnauthorizedAccessException)
{ }

if (!operationSucceeded)
{
    var res = new ResourceLoader();
    var accessDenied = new MessageDialog(
           res.GetString("access_denied_text"), 
           res.GetString("access_denied_title"));
    await accessDenied.ShowAsync();       
}
于 2013-09-13T08:55:31.407 回答