C# Web浏览器未触发DocumentCompleted事件

C# Web浏览器未触发DocumentCompleted事件,c#,multithreading,webbrowser-control,C#,Multithreading,Webbrowser Control,我正在尝试实现一个简单的网页截屏程序。当我在UI线程上使用我的代码时,所有这些似乎都可以正常工作,但当我从非UI线程调用该方法时,我无法让WebBrowserDocumentCompleted事件再次触发。我也试过: System.Windows.Forms.WebBrowser wb = new System.Windows.Forms.WebBrowser(); wb.DocumentCompleted += WebBrowserDocumentCompleted;

我正在尝试实现一个简单的网页截屏程序。当我在UI线程上使用我的代码时,所有这些似乎都可以正常工作,但当我从非UI线程调用该方法时,我无法让WebBrowserDocumentCompleted事件再次触发。我也试过:

System.Windows.Forms.WebBrowser wb = new System.Windows.Forms.WebBrowser();
        wb.DocumentCompleted += WebBrowserDocumentCompleted;
        wb.Visible = true;
        wb.ScrollBarsEnabled = false;
        wb.ScriptErrorsSuppressed = true;
        wb.Navigate(url);

        while (wb.ReadyState != System.Windows.Forms.WebBrowserReadyState.Complete)
        {
            Application.Current.Dispatcher.Invoke(DispatcherPriority.Background,
                                              new Action(delegate { }));
        }
程序只是无限期地挂起在while循环中。有什么想法吗?

类似这样的想法:

public void Start()
{
    System.Windows.Forms.WebBrowser wb = new System.Windows.Forms.WebBrowser();
    wb.DocumentCompleted += WebBrowserDocumentCompleted;
    wb.Visible = true;
    wb.ScrollBarsEnabled = false;
    wb.ScriptErrorsSuppressed = true;
    wb.Navigate(url);
}

private void WebBrowserDocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    if( (sender as WebBrowser).ReadyState == System.Windows.Forms.WebBrowserReadyState.Complete)
    {
        // Do what ever you want to do here when page is completely loaded.
    }
}

我希望这对您的任务有所帮助。

在生成输出窗口中,查找以下警告:

“发现同一从属程序集的不同版本之间存在冲突”


如果您发现此警告,请确保所有程序集使用冲突引用程序集的相同版本,并重新检查WebBrowser是否提供您的事件。

解决方案令人难以置信。经过数小时的搜索和尝试,我找到了答案

webBrowser1
的属性中,我设置了
AllowNavigation=false


如果设置为
false
,则只会注册一次
DocumentCompleted
事件,但是当
AllowNavigation=true
(默认情况下)时,
DocumentCompleted
事件会多次触发。

您不应该等待DocumentCompleted事件,应该在触发时启动操作(在事件处理程序中)我正好有这个实现,我的事件不会触发。我正在将webbrowser应用到STA后台线程中。你不应该在后台线程中创建webbrowser。你可以将其作为UI的一部分或以事件或类似形式创建。祝你好运。我需要在后台对其进行实例化。我正在使用它来呈现使用javascript/ajax呈现搜索结果,由于我提供了多线程性能,webbrowser msut将在bg线程中创建=/您需要创建一个线程,创建一个包含webbrowser的表单,并运行消息泵使其工作。看看这个简单的示例。我没有测试它,但它似乎足够简单。没有我不确定这是否是“运行消息泵”的意思,但我必须调用
Application.DoEvents()
才能触发事件。