2013-03-14 61 views
0

我試圖循環通過一個XmlNodeList,從中獲取一些數據,然後啓動一個使用這塊數據的新線程。循環通過XmlNodeList然後啓動每個新線程

這是我到目前爲止有:

public void startRun(string kwd) 
    { 
     doRun run = new doRun(); 
     run.run(kwd); 
    } 

    private void startBtn_Click(object sender, EventArgs e) 
    { 
     XmlDocument searches = new XmlDocument(); 
     searches.Load("data\\Searches.xml"); 

     XmlNodeList search = searches.SelectNodes("Searches/search"); 
     var nodeCount = search.Count; 

     for(var i = 0; i < nodeCount; i++) 
     { 
      string kwd = System.Uri.EscapeDataString(search[i].SelectSingleNode("query").InnerText); 
      doRun run = new doRun(this); 
      Thread newThread = new Thread(new ThreadStart(startRun(kwd))); 
     } 
    } 

這是不工作的。 Visual Studio是說Method name expected這條線:

Thread newThread = new Thread(new ThreadStart(startRun(kwd)));

如何傳遞這個參數到新THEAD?

回答

1

有幾個問題你的方法:

首先你的語法創建委託是錯誤的:new ThreadStart(startRun(kwd))無效語法。正確的語法是:new ThreadStart(startRun) - 僅使用方法名稱。

然後,如果您要將參數傳遞給線程,則應使用ParameterizedThreadStart代表而不是ThreadStart deleagate。

Thread newThread = new Thread(new ParameterizedThreadStart(startRun)); 

,並開始與一個調用線程Start(...)

newThread.Start(kwd); 

startRun簽名的參數應該使用的,而不是字符串對象:在裏面你能

public void startRun(object kwdObject) 

kwdstring使用它:

public void startRun(object kwdObject) 
{ 
    string kwd = (string)kwdObject; 
    // continue to do work.. 

現在,就實施startRun而言,似乎這種方法本身是多餘的。如果你有一個名爲doRun的類(順便說一句,最好是大寫類名的第一個字母) - 那麼爲什麼不直接使用doRun的run方法作爲ThreadStart委託。除非doRun.run(..)不採取行動,在這種情況下,您創建轉發函數的方法可以。

doRun run = new doRun(); 
run.run(kwd); 

第2部分

已經覆蓋在你的代碼中的問題,因爲它是,在一般它的最好考慮使用一個線程池的工作線程,而不是手動創建一個新的線程來執行你的任務如果您正在執行的任務不是長時間運行的任務(即,如果您希望任務在幾秒鐘內完成)。

要做到這一點,你可以修改你的代碼是這樣的:

for(var i = 0; i < nodeCount; i++) 
    { 
     string kwd = System.Uri.EscapeDataString(search[i].SelectSingleNode("query").InnerText); 
     ThreadPool.QueUserWorkItem((WaitCallback)startRun, kwd); 
    } 

第3部分

一個完全的工作例如,使用線程池線程:

public void startRun(object kwd) 
{ 
    doRun run = new doRun(); 
    run.run((string)kwd); 
} 

private void startBtn_Click(object sender, EventArgs e) 
{ 
    XmlDocument searches = new XmlDocument(); 
    searches.Load("data\\Searches.xml"); 

    XmlNodeList search = searches.SelectNodes("Searches/search"); 
    var nodeCount = search.Count; 

    for(var i = 0; i < nodeCount; i++) 
    { 
     string kwd = System.Uri.EscapeDataString(search[i].SelectSingleNode("query").InnerText); 

     ThreadPool.QueueUserWorkItem((WaitCallback)startRun, kwd); 
     // replace line above with the following two lines if you want to use regular threads 
     // Thread newThread = new Thread((ParameterizedThreadStart)startRun); 
     // newThread.Start(kwd); 
    } 
} 
+0

' Thread newThread = new Thread(new ParameterizedThreadStart(startRun),kwd);'給我這個錯誤:''System.Threading.Thread.Thread(System.Threading.ParameterizedThreadStart,int)'的最佳重載方法匹配'有一些無效參數' – 2013-03-14 19:04:19

+0

您是否還修改'startRun',正如我所提及的? 'startRun'必須帶一個** **對象**參數! – 2013-03-14 19:07:02

+0

是的,我修改了startRun到'startRun(object kwdObject)' – 2013-03-14 19:08:04