2013-01-18 20 views
0

爲什麼我的應用程序掛起,直到WebBrowserDocumentCompleted完成加載頁面?在這段時間內我能做些什麼來保持我的應用程序響應?應用掛起等待WebBrowser控件完成

停用的預訂 「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/"); 
    } 
} 
+0

你可以張貼一些代碼來告訴我們你做了什麼? –

+0

嘗試設置代理服務器爲NULL,它自己的線程 – Venson

+0

好還是瀏覽器中運行,請張貼代碼先生 –

回答

2

你只能用一個窗口交互如果響應窗口消息,你可以到窗口消息,如果你的UI線程處理它們只響應。因此,如果您要求您的UI線程加載網頁,它將阻止(無響應),直到Web請求完成。

的選項有:

  • 加快web請求。也許代理設置使得它需要很長時間或超時。 (或者服務器的響應可能需要很長時間才能回覆給您,在這種情況下,您可能無法做很多工作來加快速度)。

  • 如果你不能讓它更快一點,那麼你需要做的是在後臺。使用Web請求API(如果可用),這是異步的,或呼叫工人web請求線程自己,好讓你的UI線程可以繼續響應用戶輸入,直到Web數據是可用的。如果你還不知道這件事,這是非常複雜的東西,所以要準備好花一些時間和精力。

+0

能與我的版本的 – GeKson

+1

小例子,我不知道有足夠的瞭解web瀏覽器給你細節。它看起來好像Navigate是異步的,在這種情況下,它可能不是阻止你的程序的東西。或者也許你的代碼正在做其他事情(改變其他WebBrowser設置或響應WebBrowser事件),導致它停滯。嘗試創建一個儘可能少的測試程序,以查看是否可以使其正常工作,以及(如果有)從那裏建立起來。 –

+0

Navigate是異步的,不會阻塞UI線程。您可以嘗試以下操作:從Visual Studio中以調試模式啓動應用程序。當應用程序被阻止時,快速暫停(進入調試器)。然後檢查主UI線程正在等待的位置。如果需要的話,挖掘一些沒有源代碼可用的堆棧。然後回報。 – Christoph