2016-03-27 15 views
2

Webサイトが読み込まれるまで(私はWindows.Forms.WebBrowserを使用する)、自分のコードの実行をやめたいです。私はAutoResetEventを使うべきだと読んでいますが、以前はスレッディングに関連するクラスは使用していません。私はこのコードを書いていますが、それは私のプログラムをフリーズするだけです。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

可能な重複[スレッドは完全にGUIがフリーズ](のhttp:// stackoverflowの.com/questions/10423966/threads-totally-freezes-the-gui) –

+3

WaitOneの後のコードをDocumentCompletedイベントハンドラに移動するだけではどうですか? –

+1

DocumentCompletedイベントは、UIスレッドがアイドル状態のときにのみ起動できます。アイドル状態ではなく、WaitOne()呼び出しでスタックされています。これはデッドロックと呼ばれます。 *決して* UIスレッドをブロックしないでください。 WaitOne呼び出しの後でコードをDocumentCompletedイベントハンドラに移動するだけです。 –

答えて

1

あなたは非同期/私が起動を使用待つと

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

TaskCompletionSource代わりのAutoResetEventを使用することができますを利用することができます。しかし、呼び出しがでSystem.Timers.Timerの経過で、この場合には、別のスレッドにあった

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

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