2013-02-12 12 views
6

मैं .NET 4.0 का उपयोग करता हूं और मैंने यह पता लगाने की कोशिश की है कि दस्तावेज़ पूर्ण करने और मूल्य को वापस करने के लिए दस्तावेज़ पूर्ण घटना का इंतजार करने के लिए एसिंक विधि का उपयोग कैसे करें। मेरा मूल कोड ऊपर है, मैं इसे इस परिदृश्य में एसिंक/प्रतीक्षा मॉडल में कैसे बदल सकता हूं?पूर्ण घटना के साथ async विधि

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

धन्यवाद, लेकिन एक समस्या यह है कि मैं 'है मैं बनाम 2010 और .NET 4.0 का उपयोग कर रहा हूं इसलिए मुझे synctax (4.5) का इंतजार करने के बजाय पुरानी शैली का उपयोग करना चाहिए। मैं 4.0 –

+1

@namvo में काम करने के तरीके के बारे में थोड़ा उलझन में हूं, आपने विशेष रूप से कहा था कि आप एसिंक/प्रतीक्षा का उपयोग करके समाधान चाहते थे, इसलिए मुझे लगता है कि आप संगतता पैक का उपयोग कर रहे थे। यदि आप नहीं हैं, तो विधि को वापस लौटने वाले कार्य पर 'जारी रखें' का उपयोग करें ('कब डॉक्यूमेंट कॉम्प्लेटेड' ईवेंट 4.0 में काम करेगा) और उस कोड को डालें जो दस्तावेज़ के अंदर पूरा होने के बाद चलाना चाहिए। आप संभवतः सुविधा के लिए लैम्ब्डा का उपयोग करना चाहते हैं। – Servy

+0

धन्यवाद, मैं इसके साथ खेलूँगा। –