i have a globally declared list. using a foreach loop i fetch the data and create thread to work with a particular record.Here each thread need to work with only one data. But when i work with those thread then the threads are work some times with multiple data. some times with same data twice. is there any way of synchronization of threads? My need is: each thread will open and work with that particular value and close when work is done. Please suggest a suitable solution. please check my code detail below:
Globally declared list:
public static List<string[]> OutboxList = new List<string[]>();
Fetch data from list and open thread:
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();
}
The Thread Method:
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");
}
Check the array when work done:
foreach (string[] NewOutBoxFields in OutboxList)
{
Console.WriteLine("From new foreach:" + NewOutBoxFields[2] + "|" + NewOutBoxFields[6] + "\n");
}
Current output:
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
Expected Output:
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