2016-11-12 28 views
0

私の質問:非同期メソッドからの入力を待つ方法はありますか?非同期メソッドの非同期メソッド

背景情報:私はQRコードをスキャンし、スキャンした値に基づいてデータをロードするC#アプリケーションを持っています。 上記はうまくいきましたが、今では、スキャンされた値が適切なカードであるかどうかをアプリが尋ねるようにしたいと考えています。

ザは、次のようにコードが適用される:

using ZXing.Mobile; 
MobileBarcodeScanner scanner; 
private bool Correct = false; 
//Create a new instance of our scanner 
scanner = new MobileBarcodeScanner(this.Dispatcher); 
scanner.Dispatcher = this.Dispatcher; 
await scanner.Scan().ContinueWith(t => 
{ 
    if (t.Result != null) 
     HandleScanResult(t.Result); 
}); 

if (Continue) 
{ 
    Continue = false; 
    Frame.Navigate(typeof(CharacterView)); 
} 

HandleScanResult(Result)は(ダウン脱脂)される:

async void HandleScanResult(ZXing.Result result) 
{ 
    int idScan = -1; 
    if (int.TryParse(result.Text, out idScan) && idScan != -1) 
    { 
     string ConfirmText = CardData.Names[idScan] + " was found, is this the card you wanted?"; 
     MessageDialog ConfirmMessage = new MessageDialog(ConfirmText); 
     ConfirmMessage.Commands.Add(new UICommand("Yes") { Id = 0 }); 
     ConfirmMessage.Commands.Add(new UICommand("No") { Id = 1 }); 

     IUICommand action = await ConfirmMessage.ShowAsync(); 

     if ((int) action.Id == 0) 
      Continue = true; 
     else 
      Continue = false; 
    } 
} 

問題はContinue瞬間if (Continue)は1日ブロックで呼び出される偽のままでありますメッセージボックスが非同期であり、メッセージボックスが完了する前にアプリケーションがif文に続行するために、

私は既にHandleScanResult()にタスクの戻り値を与え、await HandleScanResult(t.Result);を呼び出してみました。これにより、アプリケーションはHandleScanResult()を待ってからifステートメントに進みます。 しかし、これは次のエラーが返されます。そのために行く前に、入力を待つ方法についての私の質問を

The 'await' operator can only be used within an async lambda expression. Consider marking this lambda expression with the 'async' modifier. 

を。

答えて

1

async voidメソッドが終了するまで待つことはできません。 Taskは、呼び出し元が操作が完了したことを示す何らかの種類の信号を取得できる戻り値の型です。あなたはその方法をasync Taskに変更しました。

エラーメッセージについては、次のように使用すると、コンパイラエラーを取り除くことができますことを伝えるだ:

await scanner.Scan().ContinueWith(async t => 
{ 
    if (t.Result != null) 
     await HandleScanResult(t.Result); 
}); 

t前に余分なasyncに注意してください。

しかし、これがコンパイルされたからといって、これがあなたがしなければならないことを意味するものではありません。あなたは事を過度に複雑にしており、ここではContinueWithを使用する必要はありません。 asyncメソッド本体にいる場合、すでに使用しているawait演算子は、ContinueWithの処理をより簡単に行うことができます。

var scanResult = await scanner.Scan(); 
if (scanResult != null) 
    await HandleScanResult(scanResult); 
+0

ありがとうございました!私はいくつかのサンプルコードから 'ContinueWith'を持っていたので、なぜそれを使ったのですか?もう一度ありがとう、もし私がより多くの担当者を持っていたら+1したい;-) – Fons

関連する問題