2016-04-12 19 views
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(); 
     } 
    } 

} 
+2

'templateData'はどこに定義/宣言されていますか? – Glubus

+0

'mh'とは何ですか? –

+4

@Glubusのコメントでは、lambdaの中に 'var templateData'を定義してみてください。そうでなければ、その値は異なるタスク=発行によって使用されます。 – Sinatr

答えて

1

:あなたが実際にあなたが何をしたいのか間違いなくないmailEntitiyData.HtmlContent内容を書き換えている

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); 
} 

ここに私のコードです。変更する:

foreach (var mailItem in emails) 
{ 

    string email = mailItem.Trim(); 
    templateData = mailEntitiyData.HtmlContent;    
    var customTemplateData = templateData.Replace("##FULL_NAME##", customer.Name + " " + customer.Surname); 
    var postRes = mh.SendMail(subject, customTemplateData, email, postType, null, null, bytes); 
    Logger.Log(customer.ID, email, postRes.PostID); 
} 

問題を解決する必要があります。