0

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

1 回答 1

2

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

您的选择是:

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

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

于 2013-01-18T15:32:35.447 回答