2013-02-12 43 views
6

私は.net 4.0を使用しています。非同期メソッドを使用してDocumentCompletedイベントを完了して値を返す方法を理解しようとしました。私のオリジナルコードは上記ですが、このシナリオではどのように非同期/待機モデルにすることができますか?完了したイベントの非同期メソッド

private class BrowserWindow 
    { 
     private bool webBrowserReady = false; 
     public string content = ""; 


     public void Navigate(string url) 
     { 

      xxx browser = new xxx(); 

      browser.DocumentCompleted += new EventHandler(wb_DocumentCompleted); 
      webBrowserReady = false; 
      browser.CreateControl(); 
      if (browser.IsHandleCreated) 
       browser.Navigate(url); 


      while (!webBrowserReady) 
      { 
       //Application.DoEvents(); >> replace it with async/await 
      } 

     } 

     private void wb_DocumentCompleted(object sender, EventArgs e) 
     { 
      try 
      { 
       ... 

        webBrowserReady = true; 

        content = browser.Document.Body.InnerHtml; 

      } 
      catch 
      { 

      } 

     } 

     public delegate string AsyncMethodCaller(string url); 
    } 

答えて

9

したがって、DocumentCompletedイベントが発生したときにタスクを返すメソッドが必要です。あなたが使用できることをしたら

public static Task WhenDocumentCompleted(this WebBrowser browser) 
{ 
    var tcs = new TaskCompletionSource<bool>(); 
    browser.DocumentCompleted += (s, args) => tcs.SetResult(true); 
    return tcs.Task; 
} 

:いつでもあなたは、特定のイベントのためにあなたは、このようなメソッドを作成することができることを必要とする

await browser.WhenDocumentCompleted(); 
+0

あなたの素敵なソリューションのおかげで、しかし、1つの問題は、私は「ということです私はvs 2010と.net 4.0を使用しているので、私はsynctax(4.5)を待つのではなく古いスタイルを使用する必要があります。私はそれを4.0で動作させる方法を少し混乱しています –

+1

@namvoあなたは、あなたがasync/awaitを使って解決策を望んでいたと言いました。そうでない場合は、メソッドが返すタスク( 'WhenDocumentCompleted'イベントは4.0で動作します)で' ContinueWith'を使用し、そこに文書が完成した後に実行するコードを入れてください。あなたはたぶん便宜上ラムダを使いたいと思うでしょう。 – Servy

+0

ありがとう、私はそれと一緒に遊ぶだろう。 –

関連する問題