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 ボディでの待機は禁止されています。しかし、await のないコードも機能しません。例外をキャッチできず、アプリがクラッシュします。

とにかく、この時点で実行を一時停止する必要があるため、このダイアログを同期的に表示する必要があります。それで、これを行う方法は?

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 に答える