문제

C#에서 동시 컬렉션을 가져오는 방법이나 적어도 동시 열거자를 지원하는 컬렉션을 찾고 있습니다.현재 반복 중인 컬렉션이 변경되면 InvalidOperationException이 발생합니다.컬렉션을 전체 복사하고 개인 복사본으로 작업할 수도 있지만 더 좋은 방법이 있는지 궁금합니다.

코드 조각:

foreach (String s in (List<String> )callingForm.Invoke(callingForm.delegateGetKillStrings))
    {
        //do some jazz
    }

--편집하다--

나는 대답을 얻었지만 컬렉션에 쓰는 코드도 잠금을 얻으려고 시도해야 한다는 것을 확인했습니다.

    private void addKillString(String s)
    {
        lock (killStrings)
        {
            killStrings.Add(s);
        }
    }
도움이 되었습니까?

해결책

전체 복사를 수행하는 것 외에 가장 좋은 방법은 컬렉션을 잠그는 것입니다.

   List<string> theList = (List<String> )callingForm.Invoke(callingForm.delegateGetKillStrings);
    lock(theList.SyncRoot) {
        foreach(string s in theList) {
               // Do some Jazz
        }
    }

다른 팁

따라서 귀하가 무엇을 요구하시는지 잘 모르겠지만 Parallel Extensions 팀에서는 이에 맞는 몇 가지 항목을 정리했습니다.특히 이 블로그 게시물을 참조하세요. 병렬 컬렉션 열거.여기에는 병렬 CTP를 다운로드할 수 있는 링크도 포함되어 있으며, 물론 나머지 블로그 게시물을 탐색하여 CTP의 용도와 프로그래밍 모델 작동 방식에 대한 아이디어를 얻을 수 있습니다.

FCL 컬렉션을 사용하려는 경우 중복될 수 있는 여러 스레드의 반복/수정을 지원하는 유일한 방법은 잠금입니다.

하지만 잠금 개체로 무엇을 사용하는지 주의하세요.SyncRoot를 사용하는 것은 컬렉션 자체가 컬렉션을 사용하는 클래스의 전용 멤버인 경우에만 좋은 생각입니다.컬렉션이 보호되거나 공개된 경우 클래스의 클라이언트는 SyncRoot에 자체 잠금을 설정할 수 있으며 잠재적으로 클래스의 코드와 교착 상태에 빠질 수 있습니다.

타사 컬렉션 라이브러리를 살펴보는 데 관심이 있다면 우수한 라이브러리를 추천합니다. C5 일반 컬렉션 라이브러리.그들은 잠금 없이 쉽고 안전하게 수정하고 반복할 수 있는 트리 기반 컬렉션 제품군을 가지고 있습니다. 자세한 내용은 (우수한) 문서의 섹션 8.10 및 9.11을 참조하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top