2010-11-07 120 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