2010-11-07 122 views
0

我想編碼一個多線程WebBrowser應用程序。多線程webBrowser不工作

  • WebBrowser元素只會導航到指定的URL,
  • 等待,直到它的負載,然後
    • 點擊一個按鈕或
    • 提交表單。
  • 這應該發生在一個循環中永遠。

我使用Microsoft Visual Studio 2010和Windows窗體

這裏是我的代碼:

//added windows form 30 webbrowser object 
//and now assigning them to an webbrowser array 

wbList[0] = webBrowser1; wbList[1] = webBrowser2; wbList[2] = webBrowser3; 
wbList[3] = webBrowser4; wbList[4] = webBrowser5; wbList[5] = webBrowser6; 
wbList[6] = webBrowser7; wbList[7] = webBrowser8; wbList[8] = webBrowser9; 
//etc. until: 
wbList[29] = webBrowser30; 

for (int i = 0; i < 30; i++) 
{ 
    wbList[i].ScriptErrorsSuppressed = true; 
    wbList[i].NewWindow += new CancelEventHandler(wb_NewWindow); 
} 

//********************************** creating threads here 

Thread[] AllThread = new Thread[100]; 

int irWhichWbb = 0; 
for (int nn = irDirectPostCount; nn < irNumber+1; nn++) 
{ 
    AllThread[nn] = new Thread(new 
          ParameterizedThreadStart(this.MultiThreadWebBrowser)); 
    AllThread[nn].Start(nn.ToString() + ";" + irWhichWbb.ToString()); 
    irWhichWbb++; 
} 

Application.DoEvents(); 
for (int nn = 0; nn < irNumber+1; nn++) 
{ AllThread[nn].Join(); } 

//Multi thread function 
void MultiThreadWebBrowser(object parameter) 
{ 
    string srParam = parameter.ToString(); 

    int i = Convert.ToInt32 (srParam.Substring(0,(srParam.IndexOf(";")))); 
    int irWhichWb = Convert.ToInt32(srParam.Substring(srParam.IndexOf(";")+1)); 

    string hdrs = "Referer: http://www.xxxxxxxxx.com/xxxxxxxxxx.aspx"; 

    try 
    { 
     wbList[irWhichWb].Navigate(srVotingList[i, 0], "_self", null, hdrs); 
    } 
    catch { } 

    try { waitTillLoad(irWhichWb); } 
    catch { } 
    waitTillLoad3(); 
} 

// wait until webbrowser navigate url loaded 
private void waitTillLoad(int irWhichLoad) 
{ 
    WebBrowserReadyState loadStatus; 
    //wait till beginning of loading next page 
    int waittime = 100000; 
    int counter = 0; 
    while (true) 
    { 
     try 
     { 
      loadStatus = wbList[irWhichLoad].ReadyState; 
      Application.DoEvents(); 

      if ((counter > waittime) || 
       (loadStatus == WebBrowserReadyState.Uninitialized) || 
       (loadStatus == WebBrowserReadyState.Loading) || 
       (loadStatus == WebBrowserReadyState.Interactive)) 
      { 
        break; 
      } 
      counter++; 
     } 
     catch { } 
    } 

    //wait till the page get loaded. 
    counter = 0; 
    while (true) 
    { 
     try 
     { 
      loadStatus = wbList[irWhichLoad].ReadyState; 
      Application.DoEvents(); 
      if (loadStatus == WebBrowserReadyState.Complete) 
      { 
       break; 
      } 
      if (counter > 10000000) 
       break; 
      counter++; 
     } 
     catch { } 
    } 
} 

private void waitTillLoad3() 
{ 
    DateTime dtStart = DateTime.Now; 
    while (true) 
    { 
     if ((DateTime.Now - dtStart).TotalMilliseconds > 4000) 
      break; 

     Application.DoEvents(); 
    } 
} 
+0

可能的重複[如何創建和使用工作線程上的WebBrowser控件?](http://stackoverflow.com/questions/1995527/how-might-i-create-and-use-a-webbrowser -control-on-a-worker-thread) – 2010-11-07 17:58:01

+1

試圖發送垃圾郵件給某人的網站或其他東西? – Svish 2010-11-07 18:07:30

+0

試圖自動投票。 Hans Passant也嘗試過這樣的代碼,但沒有成功。WebBrowserReadyState仍然是未初始化的AllThread [nn] .SetApartmentState(ApartmentState.MTA); – MonsterMMORPG 2010-11-07 18:11:37

回答

2

你不會說你會得到什麼樣的失敗:「不起作用」不是一個好的描述。

我會先嚐試一個單一的線程。那樣有用嗎?

你有空的catch塊,所以你默默地忽略了一些錯誤條件。這可能通過隱藏問題。

+0

它與單線程一起工作。之後,我轉換爲多線程,但它不起作用。文檔狀態永遠不會獲得文檔加載 – MonsterMMORPG 2010-11-07 18:04:04

+0

WebBrowserReadyState始終未初始化 – MonsterMMORPG 2010-11-07 18:04:20

+0

無論如何,空的catch塊是不好的形式,但至少在調試時會拋出它們。它會幫助你更快找到真正的錯誤。 – jball 2010-11-07 18:10:33