我在此代码中遇到问题:
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正在禁止等待。但是没有等待的代码也不起作用。它无法捕获异常和应用程序崩溃。
无论如何,我需要同步显示这个对话框,因为我需要暂时停止运行。那么,怎么做呢?
答案 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();
}