0

グローバルに宣言されたリストがあります。foreach ループを使用してデータをフェッチし、スレッドを作成して特定のレコードを操作します。ここでは、各スレッドは 1 つのデータのみを操作する必要があります。しかし、私がそれらのスレッドで作業すると、スレッドは複数のデータで何度か作業します。同じデータを2回使用することもあります。スレッドを同期する方法はありますか? 私の必要性は、各スレッドが開いてその特定の値で動作し、作業が完了すると閉じることです。適切な解決策を提案してください。以下の私のコードの詳細を確認してください:

グローバルに宣言されたリスト:

public static List<string[]> OutboxList = new List<string[]>();

リストからデータを取得し、スレッドを開きます。

foreach (string[] OutBoxFields in OutboxList)
  {             

    // default value of OutBoxFields[6] is QUE. Values are: a,b,c,d,e
   Console.WriteLine("From foreach loop: Data:" + OutBoxFields[2] + "|Status:" + OutBoxFields[6] + "\n");                 
   Thread OutboxThread = new Thread(() => OutboxThreadProcessor(OutBoxFields));
   OutboxThread.Start(); 

 }

スレッド方式:

static void OutboxThreadProcessor(string[] OutBoxFields)
   {

       string var = "a";
       if (OutBoxFields[2] == var)
       OutBoxFields[6] = "SENT";

       Console.WriteLine("From Thread Method: Data:" + OutBoxFields[2] + "|Status:" + OutBoxFields[6] + "\n");
 }

作業が完了したら、配列を確認します。

 foreach (string[] NewOutBoxFields in OutboxList)
       {

       Console.WriteLine("From new foreach:" + NewOutBoxFields[2] + "|" + NewOutBoxFields[6] + "\n");                       

       }

現在の出力:

From foreach loop: Data:c|Status:QUE
From foreach loop: Data:d|Status:QUE
From foreach loop: Data:a|Status:QUE
From foreach loop: Data:e|Status:QUE
From Thread Method: Data:e|Status:QUE
From Thread Method: Data:e|Status:QUE
From foreach loop: Data:b|Status:QUE
From Thread Method: Data:e|Status:QUE
From Thread Method: Data:b|Status:QUE
From Thread Method: Data:b|Status:QUE
From new foreach:c|QUE
From new foreach:d|QUE
From new foreach:a|QUE
From new foreach:e|QUE
From new foreach:b|QUE

期待される出力:

From foreach loop: Data:c|Status:QUE
From Thread Method: Data:c|Status:QUE
From foreach loop: Data:d|Status:QUE
From Thread Method: Data:d|Status:QUE
From foreach loop: Data:a|Status:QUE
From Thread Method: Data:a|Status:SENT
From foreach loop: Data:e|Status:QUE
From Thread Method: Data:e|Status:QUE
From foreach loop: Data:b|Status:QUE
From Thread Method: Data:b|Status:QUE
From new foreach:c|QUE
From new foreach:d|QUE
From new foreach:a|SENT
From new foreach:e|QUE
From new foreach:b|QUE
4

1 に答える 1

0

OutBoxFieldsあなたの問題は、新しいスレッドに渡す前にローカル変数がキャプチャされないことです。代わりに、スレッドがその時点に到達したときに、その変数の現在の値を読み取ります。

代わりに、オブジェクトを「状態オブジェクト」として明示的に渡す必要があるかもしれません。

foreach (string[] OutBoxFields in OutboxList)
{
  Thread OutboxThread = new Thread((fields) => OutboxThreadProcessor(fields));
  OutboxThread.Start(OutBoxFields);
}
于 2013-09-29T12:27:38.037 に答える