如何在Windows 8应用程序中同步显示MessageDialog?

时间:2013-09-13 08:47:38

标签: c# .net-4.5

我在此代码中遇到问题:

 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();                            
 }

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

无论如何,我需要同步显示这个对话框,因为我需要暂时停止运行。那么,怎么做呢?

1 个答案:

答案 0 :(得分:1)

通常有一些方法可以将代码重写为async calls outside of the catch block。至于为何不允许这样做,请查看this 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();       
}