1
私は何千人もの人に電子メールを送信し、並列foreachループでデータベースにログを記録しようとしていますが、顧客の名前が異なる電子メールを受け取りました。どうすればスレッドセーフにすることができますか?これを使用する並列Foreachループの奇妙な動作
EmailEntities db = new EmailEntities();
string templateData ="";
MailHelper mh = new MailHelper();
List<Customers> allCustomers = db.Customers.ToList<Customers>();
Parallel.ForEach(allCustomers, customer =>
{
string[] emails = customer.EmailAddress.Split(';');
foreach (var mailItem in emails)
{
string email = mailItem.Trim();
templateData = mailEntitiyData.HtmlContent;
templateData = templateData.Replace("##FULL_NAME##", customer.Name + " " + customer.Surname);
var postRes = mh.SendMail(subject, templateData , email, postType, null, null, bytes);
Logger.Log(customer.ID, email, postRes.PostID);
}
});
public static class Logger
{
public static void Log(int CustomerID, string email, string messageID)
{
using (EmailMarketingEntities db = new EmailMarketingEntities())
{
MailLogs ml = new MailLogs();
ml.CustomerID = CustomerID;
ml.EmailAddress = email;
ml.MessageID = messageID;
db.MailLogs.Add(ml);
db.SaveChanges();
}
}
}
'templateData'はどこに定義/宣言されていますか? – Glubus
'mh'とは何ですか? –
@Glubusのコメントでは、lambdaの中に 'var templateData'を定義してみてください。そうでなければ、その値は異なるタスク=発行によって使用されます。 – Sinatr