2012-02-22 7 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

ステータスオブジェクトとしてスレッドにリクエストを渡すのはなぜですか? 各リクエストを第2パラメータとして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: 'ProcessRequest'に渡す前に 'state'を' Request'にキャストする必要があるかもしれません。もちろん、これがOPが使用する予想されるパラメータタイプであると仮定します。ちょうどニックピッキング;-) –

+0

@ Christian.K - あなたは正しいです、答えを更新しました。乾杯! –

+1

私の答えに何が間違っているかを説明することができますか? –

関連する問題