2012-04-19 2 views
1

가능한 중복 동안 수정 :
Collection was modified; enumeration operation may not execute
컬렉션 열거

내가 열거하는 동안 몇 가지 작업을 수행하는 일반적인 목록을 가지고있다.

이가 해결 될 수있는 방법
InvalidOperationException: 
Collection was modified; enumeration operation may not execute 

, 나는 .NET 3.5에 꽉 박혀 있어요 :

foreach(Action<string> action in actionList) 
{ 
    if(action != null) { 
     action(mystring); 
    } 
} 

지금 나는이 예외가/

+1

페이지의 오른쪽에있는 "관련 항목"을 확인하십시오. 동일한 질문에 대한 답이 많이 있습니다. –

답변

6

그럼 아마도 작업 중 하나는 actionList는 무효화, 수정 반복자. 오류를 방지하는 가장 간단한 방법은 목록의 복사본을 먼저 가져 오는 것입니다 (예 :

foreach(Action<string> action in actionList.ToList()) 
{ 
    if(action != null) { 
     action(mystring);        
    } 
} 

심지어는 :

foreach (var action in actionList.Where(action => action != null).ToList()) 
{ 
    action(mystring); 
} 
+0

+1. 1 분 미만으로 대답하십시오 :) – Reniuz

+0

NullRefException을 던지는 첫 번째 코드 스 니펫을 시도했습니다 : ( – Pascal

+0

@Pascal : 어디에서 예외가 발생 했습니까? 'actionList' 자체가 null이 아닌 것으로 가정합니다. 문제를 보여주는 짧지 만 완전한 프로그램이 정말 도움이 될 것입니다 ... –

0

당신은 그것에 반복하는 동안 ACTIONLIST를 수정했습니다. 그것은 수정 또는 다른 반복을 만드는 현재 루프 또는 조치 메소드와 동기화되지 않은 두 번째 스레드 일 수 있습니다. 그래서 해결책은 될 수 :

var tmp = new List<Action<string> >(actionList); 
foreach(Action<string> action in tmp) 
{ 
    if(action != null) { 
     action(mystring);        
    } 
} 

그러나 그것은 당신이 목록을 동기화해야합니다 병렬 스레드의 경우 행동의 수정의 경우에만 작동합니다.

+0

Skeets Answer => NullRefException – Pascal

+0

Skeets가 답변을 게시하는 동안 그것을 작성했습니다. 그래서 그것을 삭제해야합니까? 또한 문제는 멀티 스레드 환경에서 발생할 수 있습니다 언급했다. – AlexTheo