2013-02-12 3 views
6

J'utilise .net 4.0 et j'ai essayé de comprendre comment utiliser la méthode async pour attendre l'événement DocumentCompleted pour compléter et renvoyer la valeur. Mon code original est ci-dessus, comment puis-je le transformer en modèle async/wait dans ce scénario?méthode asynchrone avec événement terminé

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

Répondre

9

Nous avons donc besoin d'une méthode qui renvoie une tâche lorsque l'événement DocumentCompleted se déclenche. Chaque fois que vous avez besoin que pour un événement donné, vous pouvez créer une méthode comme ceci:

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

Une fois que vous avez que vous pouvez utiliser:

await browser.WhenDocumentCompleted(); 
+0

merci pour votre bonne solution, mais un problème est que je » J'utilise vs 2010 et. Net 4.0, donc je dois utiliser l'ancien style plutôt que d'attendre synctax (4.5). Je suis un peu confus de la façon de le faire fonctionner dans 4.0 –

+1

@namvo Vous avez spécifiquement dit que vous vouliez une solution en utilisant async/await, donc j'ai supposé que vous utilisiez le pack de compatibilité. Si ce n'est pas le cas, il suffit d'utiliser 'ContinueWith' sur la tâche retournée par la méthode (l'événement' WhenDocumentCompleted' fonctionnera dans 4.0) et de mettre le code à exécuter après la fin du document. Vous voudrez probablement utiliser un lambda par commodité. – Servy

+0

merci, je vais jouer avec ça. –

Questions connexes