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

本文关键字:应用程序 挂起 完成时 WebBrowser 控件 在等待 | 更新日期: 2023-09-27 17:54:28

为什么我的应用程序挂起,直到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/");
    }
}

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

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

你的选择是:

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

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