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

时间:2013-01-18 15:23:22

标签: c# .net winforms browser webbrowser-control

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

  

已停用订阅“DocumentCompleted

该程序在方法wb.Navigate ("http:// ....");

期间也会冻结
Can you post some code to show us what you have done?

单击按钮转到页面

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/");
    }
}

1 个答案:

答案 0 :(得分:2)

如果窗口消息响应,您只能与窗口交互,并且如果您的UI线程正在处理它们,您只能响应窗口消息。因此,如果您要求您的UI线程加载网页,它将阻止(变得无法响应),直到Web请求完成。

您的选择是:

  • 加快网络请求。也许代理设置会花费很长时间或超时。 (或者可能是服务器响应需要很长时间才能回复你,在这种情况下你可能无法加快速度)。

  • 如果你无法加快速度,那么你需要在后台进行。使用异步的Web请求API(如果可用),或者自己从工作线程调用Web请求,以便UI线程可以继续响应用户输入,直到Web数据可用。如果你还不知道这是非常复杂的东西,所以要准备好花些时间和精力。