C# 应用程序在等待WebBrowser控件完成时挂起

C# 应用程序在等待WebBrowser控件完成时挂起,c#,.net,winforms,browser,webbrowser-control,C#,.net,Winforms,Browser,Webbrowser Control,为什么我的应用程序会一直挂起,直到WebBrowserDocumentCompleted完成加载页面?在这段时间内,我可以做些什么来保持应用程序的响应性 已禁用订阅“DocumentCompleted” 在方法wb.Navigate(“http://..”)期间,程序也会冻结 单击按钮并转到第页 private void ButtonStart_Click(object sender, EventArgs e) { if (this.settingsForm.tEmail.Text ==

为什么我的应用程序会一直挂起,直到WebBrowserDocumentCompleted完成加载页面?在这段时间内,我可以做些什么来保持应用程序的响应性

已禁用订阅“
DocumentCompleted

在方法
wb.Navigate(“http://..”)期间,程序也会冻结

单击按钮并转到第页

private void ButtonStart_Click(object sender, EventArgs e)
{
    if (this.settingsForm.tEmail.Text == "" || this.settingsForm.tPassword.Text == "")
    {
        MessageBox.Show("Отсутствует логин и\\или пароль для входа на сервер МосВара.\nВвести их можно, нажав на кнопку \"Настройки\".", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Hand);
        return;
    }
    wb.Navigate("http://www.moswar.ru");
}
事件处理程序

private void wb_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    //if (e.Url.AbsolutePath != (sender as WebBrowser).Url.AbsolutePath) return;
    if (wb.Document.GetElementById("login-email") != null)
    {
        wb.Document.GetElementById("login-email").InnerText = settingsForm.tEmail.Text;
        wb.Document.GetElementById("login-password").InnerText = settingsForm.tPassword.Text;
        GetElementsByClassName(new string[] {"button luxury"})[0].InvokeMember("click");
    }

    if (e.Url.AbsoluteUri == "http://www.moswar.ru/player/" || e.Url.AbsoluteUri == "http://www.moswar.ru/player/#login")
    {
        wb.Navigate("http://www.moswar.ru/metro/");
    }
}

只有当窗口响应windows消息时,您才能与它进行交互;只有当UI线程正在处理windows消息时,您才能响应这些消息。因此,如果您要求UI线程加载网页,它将阻塞(变得无响应),直到web请求完成

你的选择是:

  • 加快web请求的速度。也许代理设置会使它花费很长时间或超时。(或者可能只是服务器响应需要很长时间才能返回给您,在这种情况下,您可能无法做很多事情来加快速度)

  • 如果你不能使它更快,那么你需要在后台做。使用异步的web请求API(如果可用),或者自己从工作线程调用web请求,以便UI线程可以继续响应用户输入,直到web数据可用为止。如果你还不知道,这是一个非常复杂的问题,所以要准备投入一些时间和精力


您可以发布一些代码来向我们展示您所做的工作吗?尝试将代理设置为Nullwell,但浏览器仍在自己的线程上运行,请发布代码Sir可以是我的版本的一个小示例,我对WebBrowser了解不够,无法提供详细信息。看起来导航是异步的,在这种情况下,它可能不是阻塞程序的原因。或者,您的代码正在执行导致其暂停的其他操作(更改其他WebBrowser设置或对WebBrowser事件作出反应)。尝试创建一个测试程序,该程序尽可能不执行任何操作,以查看您是否可以让它工作,并且(如果可以)从那里构建。导航是异步的,不会阻止UI线程。您可以尝试以下操作:在Visual Studio中以调试模式启动应用程序。当应用程序被阻止时,快速暂停(进入调试器)。然后检查主UI线程正在等待的位置。如有必要,深入研究堆栈中没有可用源代码的部分。然后再报告。
private void wb_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    //if (e.Url.AbsolutePath != (sender as WebBrowser).Url.AbsolutePath) return;
    if (wb.Document.GetElementById("login-email") != null)
    {
        wb.Document.GetElementById("login-email").InnerText = settingsForm.tEmail.Text;
        wb.Document.GetElementById("login-password").InnerText = settingsForm.tPassword.Text;
        GetElementsByClassName(new string[] {"button luxury"})[0].InvokeMember("click");
    }

    if (e.Url.AbsoluteUri == "http://www.moswar.ru/player/" || e.Url.AbsoluteUri == "http://www.moswar.ru/player/#login")
    {
        wb.Navigate("http://www.moswar.ru/metro/");
    }
}