2016-08-31 2 views
0

хотел посмотреть, может ли кто-нибудь из вас, возможно, пролить свет на это. Получение элемента с тем же ключом уже был добавлен исключение в код ниже:parallel.foreach loop issue: элемент с тем же ключом уже добавлен

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

Все еще получил исключение: элемент с тем же ключом уже добавлен ... Исключение происходит случайным образом, например, 2 из 6 раз при запуске кода –

+0

Забрасывает ли он первый цикл foreach или второй? – McNultyyy

+0

Этот замок практически побеждает цель параллельной обработки. Но OP не должен использовать параллельный цикл в любом случае (см. Выше). –

Смежные вопросы