将参数传递给QueueUserWorkItem

时间:2012-02-22 11:19:54

标签: c# asp.net .net-3.5

我正在尝试使用下面的代码来触发多个线程来使用HttpWebRequest。 我在所有可能的请求中都有foreach(每个请求都有不同的数据),但是当我将请求传递给消费方法时,它似乎只接收列表中的最后一项。

有人可以帮我修复此错误吗?

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(); // 

1 个答案:

答案 0 :(得分: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);
}