但得到重复 - 创建人工线程,使用parallel.foreach和异步伺机也尝试 [英] Creating manual threads, also tried using parallel.foreach and async await - but getting duplicate

查看:236
本文介绍了但得到重复 - 创建人工线程,使用parallel.foreach和异步伺机也尝试的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问题:获得重复的项目,即越来越比环路阵列中的每个元素的数组的大小...
嗨伙计们,我创建线程创建多个线程。真正的用途是发送批量使用亚马逊SES消息的那个。 。该消息被存储在messageamazonRequestBatch和循环通过批处理运行,并将消息发送



这里是代码:



 发thrdSendEmail; 

{
串amazonMessageID =的String.Empty;
名单,LT;主题> lstThread =新的List<螺纹>();
的foreach(在arrMessageid INT N)
{
thrdSendEmail =新的Thread(()=>
{

{
amazonMessageID = SendSimpleEmail_Part2(messageAmazonRequestBatch.ElementAt(N)名.req);
messageAmazonRequestBatch.ElementAt(N)= .msg.AmazonMessageID amazonMessageID;
logManager_MessageLogwithAmazonmsgID.LogMessage(\t+ N,真正的);
//logManager_MessageLogwithAmazonmsgID.LogMessage(\",\t+ N +,\t+ messageAmazonRequestBatch.ElementAt(N).msg.QueueMessageId +,\t+ amazonMessageID,真正的);
}
赶上(例外前){logManager_RunSummary.LogMessage(ex.Message,真实);}
});
thrdSendEmail.Name = n.ToString();
lstThread.Add(thrdSendEmail);
thrdSendEmail.Start();
//logManager_MessageLogwithAmazonmsgID.LogMessage(\",\t+ N,真正的);
}
的foreach(在lstThread线程t)
{
t.Join();
//logManager_MessageLogwithAmazonmsgID.LogMessage(\",\t+ t.Name,真正的);
}
}
赶上(异常前)
{
logManager_RunSummary.LogMessage(ex.Message,真);
}



我自己也尝试parallel.foreach和非同步并等待选项...他们也给副本。我知道锁将解决这个问题,但在我的情况下,锁被降低了10倍的性能..这是我的表现降到10倍......堂妹把sendemail登录锁定阻塞,直到我获得回报amazonmessageid从亚马逊...



任何帮助将不胜感激。我不是一个新手程序员,但新线程...我联系电子邮件shabbirbohra@gmail.com



也试过PARALLEL.foreach多种形式的版本

 私人诠释SendEmailTask​​_Ve​​r9_23Jan()//尝试创建并行的foreach手动线程,并呼吁SendSimpleEmail_Part3但仍然复制
{
activeThreadCount ++ ; THREADCOUNT ++;
&IList的LT; Airmail.Core.Message>的MessageBatch = NULL;
锁(dbLocker)
{
如果(activeThreadCount> maxNoofTaskCount)// targetThreadCount
{
返回0;
}
如果(中止)
{
sendComplete = TRUE;
返回0;
}

{
的MessageBatch = messageRepository.ash_GetNextBatch_AirmailVer2(maxBatchSize,this.senderTrackingHost); //的MessageBatch = messageRepository.ash_GetNextBatch(maxBatchSize);
}
赶上(异常前)
{
logManager_RunSummary.LogException(除息);
的MessageBatch =新的List< Airmail.Core.Message>();
}
Console.WriteLine(this.currentStatus);
}
,而(的MessageBatch = NULL&放大器;!&安培; messageBatch.Count!= 0)
{
IDictionary的< Airmail.Core.Message,MessageHistory>更新所使用=新词典< Airmail.Core.Message,MessageHistory>();
BATCHSIZE = messageBatch.Count;
sendComplete = FALSE;
//的foreach(在的MessageBatch Airmail.Core.Message消息)
logManager_CollectionLog.LogMessage(\tBatch\t-\t+ messageBatch.Count +\t-\t + System.Threading.Thread.CurrentThread.ManagedThreadId,真); // ASH-TEST 11Jan14
INT intCounter = 0; //灰分teset 11han14
System.Collections.Concurrent.ConcurrentBag&下;航空邮件。 Core.Message> messageBatchConcurrent =新System.Collections.Concurrent.ConcurrentBag< Airmail.Core.Message>(的MessageBatch);
// ConcurrentBag<的所有公共和受保护成员; T>是线程安全,并且可以从多个线程同时使用。
//的foreach(在messageBatchConcurrent Airmail.Core.Message消息)
Parallel.ForEach(messageBatchConcurrent,消息=>
{
//messageBatchConcurrent.Where(x =>点¯x==消息)。取(1); // ash12Jan14
锁(statLocker)
{
//messageBatchConcurrent.TryTake(out消息);
totalProcessed ++;
intCounter + = 1; // ASH-TEST 10Jan14
message.ash_BatchLoopCounter = intCounter.ToString();
//message.ash_BatchSizeCount = messageBatchConcurrent.Count.ToString();
$} b $ b如果(message.ExpiryDate< D​​ateTime.UtcNow)
{
toUpdate.Add(消息,message.UpdateStatus(MessageStatus.Expired,,NULL,NULL,TRUE));
//message.continue(); //继续; //继续将只跳过当前迭代
的回报。使用//回报,而不是继续 - > (身体只是一个呼吁各项目功能)
}

锁(statLocker)
{
StatisticKey键=新StatisticKey(Convert.ToInt32(消息。 ash_campaignHistoryID),Convert.ToInt32(message.ash_campaignTemplateID),message.Status); // ASH25,OCT13 //空邮2.0的变化
如果(statistics.ContainsKey(密钥))statistics.Add(键,0)!;
统计[关键] - ;
}

{

串amazonMessageID =的String.Empty;
如果(message.Attachments == NULL || message.Attachments ==)// ASH25,OCT13 //空邮2.0的变化
{
// //测试如果(intCounter> ; 1000){Debugger.Break(); }
SendEmailResponse响应= NULL;
如果(message.ash_isSent ==是){返回; }
//如果(message.ash_isSent == NULL){响应= SendSimpleEmail(参考消息,message.QueueMessageId,message.ash_BatchLoopCounter + - + message.ash_BatchSizeCount,message.ash_isSent); } // ASH-TEST 11Jan14
///开始 - 这是对23Jan14

{
//Parallel.Invoke(
parallel.invoke测试//委托()//参数#2 - 在线委托
// {
//mReq.msg.AmazonMessageID = SendSimpleEmail_Part2((SendEmailRequest)mReq.req);
// logManager_MessageLog。的LogMessage(\t+ mReq.msg.QueueMessageId,真正的);
//}
//);
// intthreadCount ++;
//logManager_MessageLog.LogMessage(\",\t创造新的线程,真正的);
螺纹thrdSendEmail =新的Thread(()=>
{
如果(message.ash_isSent == NULL){响应= SendSimpleEmail_Part3(消息,message.QueueMessageId,message.ash_BatchLoopCounter + - + message.ash_BatchSizeCount,message.ash_isSent);}
});
锁(statLocker)
{
thrdSendEmail.Start();
}
thrdSendEmail.Join();
//logManager_MessageLog.LogMessage(\",\t整理新的线程,真正的);
}
//没有例外,预计在本实施例中,但如果仍然从任务,
抛出//它将被包裹在AggregateException并传播到主线程。
赶上(AggregateException E)
{
Console.WriteLine(的行动已抛出异常,这是UNEXPECTED.\\\
{0},e.InnerException.ToString()) ;
}
///结束 - 这是23Jan14
// SendRawEmailResponse响应= SendRawEmail(消息)parallel.invoke测试;

// cSH12Jan14测试// sqlLogSentMessage + =EXEC ash_Log_SentMessageids+@MessageID =+ message.QueueMessageId +,+@Identifier ='+ message.Identifier.ToString( )+',+@AmazonMessageID ='+ message.AmazonMessageID +',+@Status =+((int)的message.Status)的ToString()+,+@ToEmailAddress = '+ message.To.Address +',+@CreatedDate ='+ DateTime.UtcNow.ToString()+'\\\
;
//logManager_MessageLog.LogMessage(\t+ message.ash_BatchLoopCounter + - + message.ash_BatchSizeCount +,\t+ response.SendEmailResult.MessageId +,\t+消息.QueueMessageId,真实); // ASH-TEST 11Jan14
锁(statLocker)
{
如果(响应= NULL)amazonMessageID = response.SendEmailResult.MessageId!;
如果(message.ash_isSent ==DUPLICATE){返回; }
}
//logManager_CollectionLog.LogMessage(\"\tSendSimpleEmail\t-\t+ message.ash_BatchSizeCount + - + message.ash_BatchLoopCounter +\t-\t + message.QueueMessageId,真实); // ASH-TEST 10Jan14
}
,否则
{
SendRawEmailResponse响应= SendRawEmail(消息);
锁(statLocker)
{
如果(响应!= NULL)amazonMessageID = response.SendRawEmailResult.MessageId;
intCounter + = 1; // ASH-TEST 10Jan14
logManager_MessageLog.LogMessage(\tSendRawEmail-1+ intCounter +\t-\t+ amazonMessageID +\t- \t+ message.QueueMessageId,真实); // ASH-TEST 10Jan14
}
}
锁(statLocker)
{
message.AmazonMessageID = amazonMessageID ;
toUpdate.Add(?消息,message.UpdateStatus(amazonMessageID ==的String.Empty MessageStatus.Tested:MessageStatus.Sent,
,NULL,NULL,TRUE));
messageCount ++;
}
}
赶上(异常前)
{
如果(ex.Message.ToLower()。包含(黑名单)
|| ex.Message.ToLower()。包含(拒绝)
|| ex.Message.ToLower()。包含(未验证)
|| ex.Message.ToLower()。包含(非法)
// || message.OldStatus == MessageStatus.Failed)
|| message.Status == MessageStatus.Failed)
{
toUpdate.Add(消息,message.UpdateStatus(MessageStatus.Undeliverable,ex.Message,NULL,NULL,TRUE));
}
,否则
{
toUpdate.Add(消息,message.UpdateStatus(MessageStatus.Failed,ex.Message,NULL,NULL,TRUE));
}
Console.WriteLine(ex.Message.ToLower()); // ASH22Nov
}
锁(statLocker)
{
StatisticKey键=新StatisticKey(Convert.ToInt32(message.ash_campaignHistoryID),Convert.ToInt32(message.ash_campaignTemplateID),message.Status);(!statistics.ContainsKey(密钥))// ASH25,OCT13 //空邮2.0的变化
如果statistics.Add(键,0);
统计[关键] ++;
}
});
锁(dbLocker)
{
//cSH12Jan14-test//messageRepository.ash_Log_SentMessageids(sqlLogSentMessage);//ASH12Jan14

{
任务UpdateMessages_Task = Task.Factory.StartNew(()=> messageRepository.ash_UpdateMessages(更新所),TaskCreationOptions.AttachedToParent);
UpdateMessages_Task.Wait(); // ASH18Sep2013 - 这个任务中添加更新的消息异步
}
赶上(异常前)
{
logManager_RunSummary.LogException(前) ;
}
如果(activeThreadCount> maxNoofTaskCount)// targetThreadCount
{
返回0;
}
如果(中止)
{
sendComplete = TRUE;
返回1;
}

{
如果(的MessageBatch == NULL和放大器;&安培; messageBatch.Count == 0)
{
的MessageBatch = messageRepository.ash_GetNextBatch_AirmailVer2 (maxBatchSize,this.senderTrackingHost); //的MessageBatch = messageRepository.ash_GetNextBatch(maxBatchSize);
}
,否则{的MessageBatch = NULL; }
}
赶上(异常前)
{
logManager_RunSummary.LogException(除息);
的MessageBatch =新的List< Airmail.Core.Message>();
}
Console.WriteLine(this.currentStatus);
}
}
返回1;
}


解决方案

这是一个访问修改关闭的问题。考虑这样做的更多细节。有很多的是什么例子。



简单的解决方法是将您的n变量存储在一个临时变量无处不在,你在你的代理中使用它。

 的foreach(在arrMessageid INT N)
{
INT tempN = N;
螺纹thrdSendEmail =新的Thread(()=>
{

{
amazonMessageID = SendSimpleEmail_Part2(messageAmazonRequestBatch.ElementAt(tempN)名.req);
messageAmazonRequestBatch.ElementAt(tempN).msg.AmazonMessageID = amazonMessageID;
logManager_MessageLogwithAmazonmsgID.LogMessage(\t+ tempN,真正的);
//logManager_MessageLogwithAmazonmsgID.LogMessage(\",\t + tempN +,\t+ messageAmazonRequestBatch.ElementAt(tempN).msg.QueueMessageId +,\t+ amazonMessageID,真正的);
}
赶上(例外前){logManager_RunSummary .LogMessage(ex.Message,真实);}
});
thrdSendEmail.Name = n.ToString();
lstThread.Add(thrdSendEmail);
thrdSendEmail.Start();
//logManager_MessageLogwithAmazonmsgID.LogMessage(\",\t+ N,真正的);
}


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 is that the of sending a batch of messages using amazon ses. the messages are stored in the messageamazonRequestBatch and the loop runs through the batch and sends the messages.

HERE IS THE CODE:

Thread thrdSendEmail;
try
{
    string amazonMessageID = string.Empty;
    List<Thread> lstThread = new List<Thread>();
    foreach (int n in arrMessageid)
    {
        thrdSendEmail = new Thread(() =>
        {
                try
                {
                    amazonMessageID = SendSimpleEmail_Part2(messageAmazonRequestBatch.ElementAt(n).req);
                    messageAmazonRequestBatch.ElementAt(n).msg.AmazonMessageID = amazonMessageID;
                    logManager_MessageLogwithAmazonmsgID.LogMessage(",\t" + n , true);
                    //logManager_MessageLogwithAmazonmsgID.LogMessage(",\t" + n + ",\t" + messageAmazonRequestBatch.ElementAt(n).msg.QueueMessageId + ",\t" + amazonMessageID, true);
                }
                catch (Exception ex) { logManager_RunSummary.LogMessage(ex.Message, true); }                                
        });
        thrdSendEmail.Name = n.ToString();
        lstThread.Add(thrdSendEmail);
        thrdSendEmail.Start();
        //logManager_MessageLogwithAmazonmsgID.LogMessage(",\t" + n, true);
    }
    foreach (Thread t in lstThread)
    {
        t.Join();
        //logManager_MessageLogwithAmazonmsgID.LogMessage(",\t" + t.Name, true);
    }
}
catch (Exception ex)
{
    logManager_RunSummary.LogMessage(ex.Message, true);
}

I have also tried parallel.foreach and asynch and await options... they also give the duplicates. I know that the lock will solve the problem but in my case the lock degrades the performance by a factor of 10.. that is my performance drops 10 times... coz putting the sendemail login in lock is blocking untill i get a return amazonmessageid from amazon...

Any help on this will be greatly appreciated. I am not a novice programmer but new to threading...my contact email is shabbirbohra@gmail.com

ALSO TRIED MANY VERSION OF PARALLEL.foreach

private int SendEmailTask_Ver9_23Jan()//tried to create manual threads in parallel foreach and called SendSimpleEmail_Part3 but still duplicates
{
    activeThreadCount++; threadCount++;
    IList<Airmail.Core.Message> messageBatch = null;
    lock (dbLocker)
    {
        if (activeThreadCount > maxNoofTaskCount)//targetThreadCount
        {
            return 0;
        }
        if (abort)
        {
            sendComplete = true;
            return 0;
        }
        try
        {
            messageBatch = messageRepository.ash_GetNextBatch_AirmailVer2(maxBatchSize, this.senderTrackingHost);//messageBatch = messageRepository.ash_GetNextBatch(maxBatchSize);                    
        }
        catch (Exception ex)
        {
            logManager_RunSummary.LogException(ex);
            messageBatch = new List<Airmail.Core.Message>();
        }
        Console.WriteLine(this.currentStatus);
    }
    while (messageBatch != null && messageBatch.Count != 0)
    {
        IDictionary<Airmail.Core.Message, MessageHistory> toUpdate = new Dictionary<Airmail.Core.Message, MessageHistory>();
        batchSize = messageBatch.Count;
        sendComplete = false;
        //foreach (Airmail.Core.Message message in messageBatch)                
        logManager_CollectionLog.LogMessage("\tBatch\t-\t" + messageBatch.Count + "\t-\t" + System.Threading.Thread.CurrentThread.ManagedThreadId, true);//ASH-TEST 11Jan14
        int intCounter = 0;//ash-teset 11han14
        System.Collections.Concurrent.ConcurrentBag<Airmail.Core.Message> messageBatchConcurrent = new System.Collections.Concurrent.ConcurrentBag<Airmail.Core.Message>(messageBatch);
        //All public and protected members of ConcurrentBag<T> are thread-safe and may be used concurrently from multiple threads.
        //foreach (Airmail.Core.Message message in messageBatchConcurrent)
        Parallel.ForEach(messageBatchConcurrent, message =>                
        {
            //messageBatchConcurrent.Where(x => x == message).Take(1);//ash12Jan14
            lock (statLocker)
            {
                //messageBatchConcurrent.TryTake(out message);
                totalProcessed++;
                intCounter += 1;//ASH-TEST 10Jan14                    
                message.ash_BatchLoopCounter = intCounter.ToString();
                //message.ash_BatchSizeCount = messageBatchConcurrent.Count.ToString();
            }
            if (message.ExpiryDate < DateTime.UtcNow)
            {
                toUpdate.Add(message, message.UpdateStatus(MessageStatus.Expired, "", null, null, true));
                //message.continue(); //continue;//continue will just skip the current iteration.
                return; //using return instead of continue as --> (the body is just a function called for each item)
            }

            lock (statLocker)
            {
                StatisticKey key = new StatisticKey(Convert.ToInt32(message.ash_campaignHistoryID), Convert.ToInt32(message.ash_campaignTemplateID), message.Status);//ASH25,OCT13//Airmail 2.0 changes
                if (!statistics.ContainsKey(key)) statistics.Add(key, 0);
                statistics[key]--;
            }
            try
            {

                string amazonMessageID = string.Empty;
                if (message.Attachments == null || message.Attachments == "")//ASH25,OCT13//Airmail 2.0 changes
                {
                    //test//if (intCounter > 1000) { Debugger.Break(); }
                    SendEmailResponse response = null;
                    if (message.ash_isSent == "YES") { return; }
                    //if (message.ash_isSent == null) { response = SendSimpleEmail(ref message, message.QueueMessageId, message.ash_BatchLoopCounter + "-" + message.ash_BatchSizeCount, message.ash_isSent); }//ASH-TEST 11Jan14                           
                    /// Start - this is parallel.invoke testing on 23Jan14
                    try
                    {
                        //Parallel.Invoke(
                        //    delegate()        // Param #2 - in-line delegate
                        //    {
                        //mReq.msg.AmazonMessageID = SendSimpleEmail_Part2((SendEmailRequest)mReq.req);
                        //logManager_MessageLog.LogMessage(",\t" + mReq.msg.QueueMessageId, true);
                        //    }
                        //);
                        //intthreadCount++;
                        //logManager_MessageLog.LogMessage(",\t creating new thread", true);
                        Thread thrdSendEmail = new Thread(() =>
                        {
                            if (message.ash_isSent == null) { response = SendSimpleEmail_Part3(message, message.QueueMessageId, message.ash_BatchLoopCounter + "-" + message.ash_BatchSizeCount, message.ash_isSent); }
                        });
                        lock (statLocker)
                        {
                            thrdSendEmail.Start();                                    
                        }
                        thrdSendEmail.Join();
                        //logManager_MessageLog.LogMessage(",\t finishing new thread", true);
                    }
                    // No exception is expected in this example, but if one is still thrown from a task, 
                    // it will be wrapped in AggregateException and propagated to the main thread. 
                    catch (AggregateException e)
                    {
                        Console.WriteLine("An action has thrown an exception. THIS WAS UNEXPECTED.\n{0}", e.InnerException.ToString());
                    }
                    /// End -   this is parallel.invoke testing on 23Jan14                            
                    //SendRawEmailResponse response = SendRawEmail(message);

                    //cSH12Jan14-test//sqlLogSentMessage += "EXEC ash_Log_SentMessageids  " + "@MessageID = " + message.QueueMessageId + ", " + "@Identifier = '" + message.Identifier.ToString() + "', " + "@AmazonMessageID = '" + message.AmazonMessageID + "', " + "@Status = " + ((int)message.Status).ToString() + ", " + "@ToEmailAddress = '" + message.To.Address + "', " + "@CreatedDate = '" + DateTime.UtcNow.ToString() + "'\n";
                    //logManager_MessageLog.LogMessage( ",\t" + message.ash_BatchLoopCounter + "-" + message.ash_BatchSizeCount +  ",\t" + response.SendEmailResult.MessageId + ",\t" + message.QueueMessageId, true);//ASH-TEST 11Jan14
                    lock (statLocker)
                    {
                        if (response != null) amazonMessageID = response.SendEmailResult.MessageId;
                        if (message.ash_isSent == "DUPLICATE") { return; }
                    }
                    //logManager_CollectionLog.LogMessage("\tSendSimpleEmail\t-\t" + message.ash_BatchSizeCount + "-" + message.ash_BatchLoopCounter + "\t-\t" + message.QueueMessageId, true);//ASH-TEST 10Jan14                            
                }
                else
                {
                    SendRawEmailResponse response = SendRawEmail(message);
                    lock (statLocker)
                    {
                        if (response != null) amazonMessageID = response.SendRawEmailResult.MessageId;
                        intCounter += 1;//ASH-TEST 10Jan14
                        logManager_MessageLog.LogMessage("\tSendRawEmail-1" + intCounter + "\t-\t" + amazonMessageID + "\t-\t" + message.QueueMessageId, true);//ASH-TEST 10Jan14
                    }
                }
                lock (statLocker)
                {
                    message.AmazonMessageID = amazonMessageID;
                    toUpdate.Add(message, message.UpdateStatus(amazonMessageID == string.Empty ? MessageStatus.Tested : MessageStatus.Sent,
                                                                "", null, null, true));
                    messageCount++;
                }
            }
            catch (Exception ex)
            {
                if (ex.Message.ToLower().Contains("blacklist")
                 || ex.Message.ToLower().Contains("rejected")
                 || ex.Message.ToLower().Contains("not verified")
                 || ex.Message.ToLower().Contains("illegal")
                    //|| message.OldStatus == MessageStatus.Failed)
                 || message.Status == MessageStatus.Failed)
                {
                    toUpdate.Add(message, message.UpdateStatus(MessageStatus.Undeliverable, ex.Message, null, null, true));
                }
                else
                {
                    toUpdate.Add(message, message.UpdateStatus(MessageStatus.Failed, ex.Message, null, null, true));
                }
                Console.WriteLine(ex.Message.ToLower());//ASH22Nov
            }
            lock (statLocker)
            {
                StatisticKey key = new StatisticKey(Convert.ToInt32(message.ash_campaignHistoryID), Convert.ToInt32(message.ash_campaignTemplateID), message.Status);//ASH25,OCT13//Airmail 2.0 changes
                if (!statistics.ContainsKey(key)) statistics.Add(key, 0);
                statistics[key]++;
            }
        });
        lock (dbLocker)
        {
            //cSH12Jan14-test//messageRepository.ash_Log_SentMessageids(sqlLogSentMessage);//ASH12Jan14
            try
            {
                Task UpdateMessages_Task = Task.Factory.StartNew(() => messageRepository.ash_UpdateMessages(toUpdate), TaskCreationOptions.AttachedToParent);
                UpdateMessages_Task.Wait();//ASH18Sep2013 - This task added for updating message asynchronously
            }
            catch (Exception ex)
            {
                logManager_RunSummary.LogException(ex);
            }
            if (activeThreadCount > maxNoofTaskCount)//targetThreadCount
            {
                return 0;
            }
            if (abort)
            {
                sendComplete = true;
                return 1;
            }
            try
            {
                if (messageBatch == null && messageBatch.Count == 0)
                {
                    messageBatch = messageRepository.ash_GetNextBatch_AirmailVer2(maxBatchSize, this.senderTrackingHost);//messageBatch = messageRepository.ash_GetNextBatch(maxBatchSize);
                }
                else { messageBatch = null; }
            }
            catch (Exception ex)
            {
                logManager_RunSummary.LogException(ex);
                messageBatch = new List<Airmail.Core.Message>();
            }
            Console.WriteLine(this.currentStatus);
        }
    }
    return 1;
}

解决方案

It's an "Access to modified closure" problem. Look into that for more details. There's a lot of examples of what it is.

Simple fix is to store your n variable in a temp variable everywhere you use it in your delegate.

foreach (int n in arrMessageid)
    {
        int tempN = n;
        Thread thrdSendEmail = new Thread(() =>
        {
                try
                {
                    amazonMessageID = SendSimpleEmail_Part2(messageAmazonRequestBatch.ElementAt(tempN ).req);
                    messageAmazonRequestBatch.ElementAt(tempN ).msg.AmazonMessageID = amazonMessageID;
                    logManager_MessageLogwithAmazonmsgID.LogMessage(",\t" + tempN  , true);
                    //logManager_MessageLogwithAmazonmsgID.LogMessage(",\t" + tempN  + ",\t" + messageAmazonRequestBatch.ElementAt(tempN ).msg.QueueMessageId + ",\t" + amazonMessageID, true);
                }
                catch (Exception ex) { logManager_RunSummary.LogMessage(ex.Message, true); }                                
        });
        thrdSendEmail.Name = n.ToString();
        lstThread.Add(thrdSendEmail);
        thrdSendEmail.Start();
        //logManager_MessageLogwithAmazonmsgID.LogMessage(",\t" + n, true);
    }

这篇关于但得到重复 - 创建人工线程,使用parallel.foreach和异步伺机也尝试的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆