问题:获取重复的项目,即创建的线程数量多于数组大小......
大家好,我正在为数组的每个元素循环创建线程。真正的用途是使用亚马逊ses发送一批消息。消息存储在 messageamazonRequestBatch 中,循环运行该批处理并发送消息。
这是代码:
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);
}
我也尝试过parallel.foreach 和 asynch 以及await 选项...它们也给出了重复项。我知道锁会解决问题,但在我的情况下,锁会使性能降低 10 倍.. 也就是说我的性能下降了 10 倍... 因为将 sendemail 登录放入锁中会阻塞,直到我得到返回的 amazonmessageid来自亚马逊...
对此的任何帮助将不胜感激。我不是新手程序员,但对线程很陌生......
您的 lambda 表达式正在捕获循环变量n
,所以当你的 lambda 执行时,n
已经改变了;你需要复制n
到循环内的局部变量。 (假设您使用的是 C# 4 或更早版本;C# 5 解决了该问题)。
另一个问题是所有线程都使用相同的amazonMessageID
多变的;您应该在 lambda 表达式中声明它。
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); }
});
...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)