2016-08-31 61 views
0

想要了解您是否有其中一位可以闡明這一點。 獲取的項目使用相同的密鑰已經被添加例外在下面的代碼:parallel.foreach循環問題:具有相同密鑰的項目已被添加

foreach (EmailMessage m in findResultsSentItems) 
{ 
    em.Add(m); 
} 
lstMailContactDeatils.Clear(); 
Parallel.ForEach(em, 
     myItem => 
     { 
      myItem.Load(); 
      foreach (EmailAddress e in myItem.ToRecipients) 
      { 
       try 
       { 
        MailContactDeatils _MailContactDeatils1 = new MailContactDeatils(); 
        _MailContactDeatils1.MailID = e.Address; 
        _MailContactDeatils1.DisplayName = e.Name; 
        _MailContactDeatils1.SentTime = myItem.DateTimeSent.ToString(); 
       // if(lstMailContactDeatils.Contains()) 
        lstMailContactDeatils.Add(_MailContactDeatils1); 
       } 
       catch (Exception e1) { exceptions.Enqueue(e1); } 
      } 
      foreach (EmailAddress e in myItem.CcRecipients) 
      { 
       try 
       { 
        MailContactDeatils _MailContactDeatils2 = new MailContactDeatils(); 
        _MailContactDeatils2.MailID = e.Address; 
        _MailContactDeatils2.DisplayName = e.Name; 
        _MailContactDeatils2.SentTime = myItem.DateTimeSent.ToString(); 
        lstMailContactDeatils.Add(_MailContactDeatils2); 
       } 
       catch (Exception e2) { exceptions.Enqueue(e2); } 
      } 
     }); 

的LINQ語句是從哪裏獲得拋出的ArgumentExcpetion說:具有相同鍵的項已被添加

+0

您是否有在MailContactDeatils中定義的自定義相等比較? – LordWilmore

+2

什麼是'lstMailContactDeatils'? –

+0

lstMailContactDeatils是MailContactDeatils類型列表..... public class MailContactDeatils { public string DisplayName {get;組; } public string MailID {get;組; } public string SentTime {get;組; } } –

回答

-1

在使用Parallel時,您需要在添加前鎖定。

object padlock = new object(); 

foreach (EmailMessage m in findResultsSentItems) 
{ 
    em.Add(m); 
} 
lstMailContactDeatils.Clear(); 
Parallel.ForEach(em, 
     myItem => 
     { 
      myItem.Load(); 
      foreach (EmailAddress e in myItem.ToRecipients) 
      { 
       try 
       { 
        MailContactDeatils _MailContactDeatils1 = new MailContactDeatils(); 
        _MailContactDeatils1.MailID = e.Address; 
        _MailContactDeatils1.DisplayName = e.Name; 
        _MailContactDeatils1.SentTime = myItem.DateTimeSent.ToString(); 

        lock(padlock) { 
         if(!lstMailContactDeatils.Contains(_MailContactDeatils1)) 
          lstMailContactDeatils.Add(_MailContactDeatils1); 
        } 
       } 
       catch (Exception e1) { exceptions.Enqueue(e1); } 
      } 
      foreach (EmailAddress e in myItem.CcRecipients) 
      { 
       try 
       { 
        MailContactDeatils _MailContactDeatils2 = new MailContactDeatils(); 
        _MailContactDeatils2.MailID = e.Address; 
        _MailContactDeatils2.DisplayName = e.Name; 
        _MailContactDeatils2.SentTime = myItem.DateTimeSent.ToString(); 
        lock(padlock) { 
         if (!lstMailContactDeatils.Contains(_MailContactDeatils2)) 
          lstMailContactDeatils.Add(_MailContactDeatils2); 
        } 
       } 
       catch (Exception e2) { exceptions.Enqueue(e2); } 
      } 
     }); 
+0

仍然有異常:具有相同密鑰的項目已被添加...異常隨機發生,如運行代碼時的6次中的2次 –

+0

是拋出第一個foreach循環還是第二個? – McNultyyy

+0

這個鎖實際上破壞了並行處理的目的。但OP不應該使用並行循環(見上文)。 –

相關問題