ISSUE: Getting duplicate items, i.e more threads are getting created than the array size... Hi Folks, I am creating thread in the loop for each element of array. The real use i
Your lambda expression is capturing the loop variable n
, so when your lambda executes, the value of n
has already changed; you need to copy n
to a local variable inside the loop. (assuming you're using C# 4 or earlier; C# 5 fixed that problem).
Another issue is that all your threads use the same amazonMessageID
variable; you should declare it inside the lambda expression instead.
foreach (int n in arrMessageid)
{
int n2 = n;
thrdSendEmail = new Thread(() =>
{
try
{
string amazonMessageID = SendSimpleEmail_Part2(messageAmazonRequestBatch.ElementAt(n2).req);
messageAmazonRequestBatch.ElementAt(n2).msg.AmazonMessageID = amazonMessageID;
logManager_MessageLogwithAmazonmsgID.LogMessage(",\t" + n2 , true);
//logManager_MessageLogwithAmazonmsgID.LogMessage(",\t" + n2 + ",\t" + messageAmazonRequestBatch.ElementAt(n2).msg.QueueMessageId + ",\t" + amazonMessageID, true);
}
catch (Exception ex) { logManager_RunSummary.LogMessage(ex.Message, true); }
});
...
I don't like that your threads share the same variables (I mean n
and amazonMessageID
), it is not thread safe and it may cause your problem. Moreover I suggest you to use Parallel.ForEach method, it can make your code easy. It could look like this:
try
{
Parallel.ForEach(arrMessageid.Distinct(),
n =>
{
try
{
var amazonMessageID = SendSimpleEmail_Part2(messageAmazonRequestBatch.ElementAt(n).req);
messageAmazonRequestBatch.ElementAt(n).msg.AmazonMessageID = amazonMessageID;
logManager_MessageLogwithAmazonmsgID.LogMessage(",\t" + n , true);
}
catch (Exception ex)
{
logManager_RunSummary.LogMessage(ex.Message, true);
}
}
);
}
catch (Exception ex)
{
logManager_RunSummary.LogMessage(ex.Message, true);
}