Creating manual threads - but getting duplicate threads

前端 未结 2 1689
离开以前
离开以前 2021-01-23 16:38

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

相关标签:
2条回答
  • 2021-01-23 17:26

    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); }                                
                    });
     ...
    
    0 讨论(0)
  • 2021-01-23 17:26

    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);
    }
    
    0 讨论(0)
提交回复
热议问题