我正在尝试使用下面的代码来触发多个线程来使用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(); //
答案 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);
}