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 要求が完了するまでブロックされます (応答しなくなります)。

オプションは次のとおりです。

  • Web リクエストを高速化します。プロキシ設定により、時間がかかったり、タイムアウトになったりしている可能性があります。(または、サーバーの応答が戻ってくるまでに時間がかかっている可能性があります。この場合、速度を上げるために多くのことを行うことはできません)。

  • 高速化できない場合は、バックグラウンドで実行する必要があります。非同期の Web 要求 API (使用可能な場合) を使用するか、自分でワーカー スレッドから Web 要求を呼び出して、Web データが使用可能になるまで UI スレッドがユーザー入力に応答し続けることができるようにします。これは、まだ知らない場合は非常に複雑なことなので、時間と労力を費やす準備をしてください。

于 2013-01-18T15:32:35.447 に答える