2016-03-27 19 views
2

ile işlenmesini bekliyorum Kodu web sitesi yüklenene kadar durdurmak istiyorum (Windows.Forms.WebBrowser kullanıyorum). AutoResetEvent kullanmam gerektiğini okudum, ancak daha önce iş parçacığı ile ilgili bir sınıf kullanmıyorum. Bu kodu yazarım ama sadece programımı dondur, nasıl düzeltirsin? Sen asenk yararlanabilirlerOlayın AutoResetEvent

var evt = new AutoResetEvent(false); 
webBrowser.DocumentCompleted += (sender1, e1) => 
{ 
    if (webBrowser.ReadyState == WebBrowserReadyState.Complete) 
    { 
     evt.Set(); 
    } 

}; 
webBrowser.Navigate("https://www.google.com/"); 
evt.WaitOne();  //wait to evt.Set() call 
//... 
//further code 
+0

Olası yinelenen [Konu tamamen GUI donar] (http: // stackoverflow .com/question/10423966/thread-totally-freezes-the-gui) –

+3

Neden WaitOne'den sonra DocumentCompleted olay işleyicisine kodu taşımak değil? –

+1

DocumentCompleted olayı, yalnızca UI iş parçacığınız boşken tetiklenebilir. Boşta değil, WaitOne() çağrısında kalmış. Buna deadlock denir. * UI iş parçacığını asla * engellemeyin. WaitOne çağrısından sonra, DocumentCompleted olay işleyicinize kodu taşımanız yeterlidir. –

cevap

1

/bekliyor ve yerine AutoResetEvent

ben Invoke kullanılan
TaskCompletionSource<object> tcs = new TaskCompletionSource<object>(); 
webBrowser.DocumentCompleted += (sender1, e1) => tcs.TrySetResult(null); 
webBrowser.Navigate("https://www.google.com/"); 
await tcs.Task; 
0

TaskCompletionSource kullanabilirsiniz. Ama çağırır bir System.Timers.Timer ait Elapsed bu durumda, başka Konuya oldu

MethodInvoker invoke = delegate() 
{ 
    webBrowser1.Navigate(url); 
}; 
this.Invoke(invoke); 
this.autoresetevent.WaitOne(); 

ve

void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
{ 
    this.autoresetevent.Set(); 
} 
ait
İlgili konular