【问题标题】:webBrowser.Navigate synchronouslywebBrowser.Navigate 同步
【发布时间】:2011-09-03 23:29:11
【问题描述】:

我想同步调用 webBrowser.Navigate(string urlString),其中 webBrowser 是 Windows 窗体控件。我就是这样做的

...
private delegate void NavigateDelegate(string s);
...
private void Function()
{
    NavigateDelegate navigateDelegate = 
        new NavigateDelegate(this.webBrowser1.Navigate);
    IAsyncResult asyncResult = 
        navigateDelegate.BeginInvoke("http://google.com", null, null);

    while (!asyncResult.IsCompleted)
    {
        Thread.Sleep(10);
    }

    MessageBox.Show("Operation has completed !");
}

但消息永远不会被推送。为什么这段代码不能正常工作?

【问题讨论】:

  • 您不需要使用委托 - webbrowser.Navigate 是异步方法。 msdn.microsoft.com/en-us/library/…
  • 我知道这个方法是异步的。我想同步重制它,我认为这段代码会帮助我......
  • delegate.BeginInvoke 是异步方法。您的代码运行异步方法异步:两次异步。所以,这根本不是你想做的。
  • 你完全正确!谢谢

标签: c# .net browser


【解决方案1】:

不是最好的方法,但你可以使用这个...

while (this.webBrowser.ReadyState != WebBrowserReadyState.Complete)
{
     Application.DoEvents();
     Thread.Sleep(100);
}

【讨论】:

    【解决方案2】:

    而不是使用它来检索页面同步

    this.webBrowser.DocumentCompleted += WebBrowserDocumentCompleted;
    this.webBrowser.Navigate("http://google.com");
    
    private void WebBrowserDocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
      MessageBox.Show("Operation has completed !");
    }
    

    【讨论】:

    • 感谢 Teoman 的快速回答,但我很感兴趣为什么我的代码不起作用,而不是如何实现这个!
    • 您的代码不起作用,因为您尝试异步使用 Navigate 函数。要获得结果,您需要使用 EndInvoke,但如果同步调用此方法是您想要的,上面的代码 sn-p 是要走的路。
    • 是的,但不是使用 BeginInvoke 或单独的线程。在文档加载事件期间,主线程可以很容易地通过休眠来阻塞。
    • 如果你在回答中写了Synchronous,意思是说这是异步的(因为同步会阻塞主线程),这可能会导致读者误解。顺便说一句,我很确定,内部导航也使用单独的线程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-09
    相关资源
    最近更新 更多