等待使用AutoResetEvent处理事件

时间:2016-03-27 21:29:06

标签: c# .net winforms

我想停止执行我的代码,直到加载网站(我使用Windows.Forms.WebBrowser)。我读过我应该使用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

2 个答案:

答案 0 :(得分:1)

您可以使用async / await并使用 TaskCompletionSource 代替 AutoResetEvent

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

答案 1 :(得分:0)

我使用了Invoke。但是Invoke是在另一个Thread中,在这种情况下是在System.Timers.Timer的Elapsed中

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

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