グローバルに宣言されたリストがあります。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