2015-01-05 4 views
0

를 사용하여 반복 할 때 나는이 내 응용 프로그램에서 다음과 같은 기능 :컬렉션 수정 오류, foreach 루프

// Method To Save Logs Buffer In Memory To DB 
public void SaveLogsToDB() 
{ 
    // Proceed If There Is Any Logs In Buffer 
    if (LogsViewer.DBLogEntries.Count > 0) 
    { 
     // Init 
     string massInertStr = "INSERT INTO IC_Logs ([Date], [Time], [Type], [Entry], [Synced], [CreatedOn]) VALUES "; 

     // Build Mass Insert String 
     List<DBLog> currentLogEntries = LogsViewer.DBLogEntries; 
     foreach (DBLog myDBLog in currentLogEntries) 
     { 
      // Generate Insert Statement 
      massInertStr += String.Format("('{0}', '{1}', '{2}', '{3}', 0, GETDATE()),", 
       myDBLog.Date, 
       myDBLog.Time, 
       myDBLog.Type, 
       myDBLog.Entry.Replace("'", "''")); 
     } 
     massInertStr = massInertStr.Remove(massInertStr.Length - 1); 

     // Expect Errors 
     try 
     { 
      // Execute Mass Insert 
      MyDb.ExecuteNonQuery(massInertStr); 

      // Clear Logs Buffer 
      LogsViewer.DBLogEntries.RemoveAll(item => currentLogEntries.Contains(item)); 
     } 
     catch { } 
    } 
} 

내 응용 프로그램이 실행될 때, 때때로 나는 다음과 같은 예외 얻을 때 :

컬렉션 수정되었습니다. 열거 연산이 실행되지 않을 수 있습니다.

오류는이 라인에서 발생 : foreach (DBLog myDBLog in currentLogEntries) { ... }

currentLogEntries 컬렉션이 아닌 참조의 복사본이 아닌가? 왜이 오류가 발생하는지 또는이를 막는 방법을 모르겠습니다.

+0

윌이 도움이 같은 (필자는 foreach 루프를 실행하기 전에) :'DBLog [] currentLogEntries = 새 DBLog [LogsViewer.DBLogEntries.Count] LogsViewer.DBLogEntries.CopyTo (currentLogEntries); '? – Latheesan

+2

'currentLogEntries가 참조가 아닌 콜렉션의 복사본이 아닌가? '아니요, 참조입니다. –

+2

'currentLogEntries'는 사본이 아닙니다. 같은 참조 사본입니다. 콜렉션의 사본을 가져 오거나 동시 콜렉션을 사용해야합니다. 제안 된 사본이 도움이 될 것입니다. –

답변

3

당신은 더 나은 깊은 복제에 이렇게 당신은 목록 :

List<DBLog> currentLogEntries = new List<DBLog>(LogsViewer.DBLogEntries); 
+0

고마워, 이제 이걸 시험해 볼게. – Latheesan