2012-02-22 181 views
2

我試圖使用下面的代碼來觸發多個線程來使用HttpWebRequest。 我在所有可能的請求中做了foreach(每個請求都有不同的數據),但是當我將請求傳遞給消費方法時,它似乎只接收列表中的最後一項。將參數傳遞給QueueUserWorkItem

有人可以幫我解決這個錯誤嗎?

int pending = requests.Count; 
var finished = new ManualResetEvent(false); 
foreach (Request request in requests) 
{ 
    // Required to close over the loop variable correctly. 
    Request capture = request; 
    ThreadPool.QueueUserWorkItem(
    (state) => 
    { 
     try 
     { 
     ProcessRequest(capture); 
     } 
     finally 
     { 
     if (Interlocked.Decrement(ref pending) == 0) 
     { 
      finished.Set(); // Signal completion of all work items. 
     } 
     } 
    }, null); 
} 
finished.WaitOne(); // 

回答

3

爲什麼你不把你的請求作爲狀態對象傳遞給線程? 只需將每個請求作爲第二個參數傳遞給ThreadPool.QueueUserWorkItem即可。這是將數據傳遞給線程的首選方式。

foreach (Request request in requests) 
{ 
    ThreadPool.QueueUserWorkItem(
    state => 
    { 
     try 
     { 
     ProcessRequest(state as Request); 
     } 
     finally 
     { 
     if (Interlocked.Decrement(ref pending) == 0) 
     { 
      finished.Set(); // Signal completion of all work items. 
     } 
     } 
    }, request); 
} 
+2

+1:在將'state'傳遞給'RequestRequest'之前,可能需要將'state'強制轉換爲'ProcessRequest'。當然,假設這是OP使用的預期參數類型。只是挑剔;-) – 2012-02-22 11:42:04

+0

@ Christian.K - 你是對的,更新了答案。乾杯! – 2012-02-22 11:43:37

+1

可以downvoter解釋我的答案有什麼問題嗎? – 2012-02-22 11:54:06