Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正在等待使用AutoResteEvent处理事件_C#_.net_Winforms - Fatal编程技术网

C# 正在等待使用AutoResteEvent处理事件

C# 正在等待使用AutoResteEvent处理事件,c#,.net,winforms,C#,.net,Winforms,我想在网站加载之前停止执行代码(我使用Windows.Forms.WebBrowser)。我读到应该使用AutoResetEvent,但我以前没有使用任何与线程相关的类。我写了这段代码,但它只冻结了我的程序,如何修复它 var evt = new AutoResetEvent(false); webBrowser.DocumentCompleted += (sender1, e1) => { if (webBrowser.ReadyState == WebBrowserReadyS

我想在网站加载之前停止执行代码(我使用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

您可以使用async/await,也可以使用TaskCompletionSource而不是AutoResteEvent

TaskCompletionSource tcs=new TaskCompletionSource();
webBrowser.DocumentCompleted+=(发送方1,e1)=>tcs.TrySetResult(null);
webBrowser.Navigate(“https://www.google.com/");
等待tcs任务;

我使用了Invoke。但是调用在另一个线程中,在本例中是在System.Timers.Timer的运行过程中

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


可能重复为什么不在WaitOne之后将代码移动到DocumentCompleted事件处理程序中??DocumentCompleted事件只能在UI线程空闲时触发。它不是空闲的,它被挂在WaitOne()调用上。这称为死锁。永远不要阻塞UI线程。只需将WaitOne调用后的代码移动到DocumentCompleted事件处理程序中即可。
MethodInvoker invoke = delegate ()
{
     webBrowser1.Navigate(url);
};
this.Invoke(invoke);
this.autoresetevent.WaitOne();
void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
     this.autoresetevent.Set();
}