2012-09-10 3 views
1

많은 수의 개체 및 순차 읽기 작업을하고 있습니다. 이 줄에있는 대부분의 질문은 멀티 스레딩을 의미하는 것으로 나타났습니다.하지만 배포 가능한 라이브러리의 오용으로 인해 스레드 자체의 오류가 더 걱정됩니다.순차적으로 읽는 동안 수집 수정 금지

라이브러리의 시스템은 잠재적으로 많은 개체 모음을 관리하며 한 번에이 모음의 순차적 읽기를 수행하여 각 요소에 대한 작업을 수행합니다. 라이브러리 외부에서 확장 될 수있는 요소 구현에 따라 개체가 컬렉션에서 자신을 제거하려고 시도 할 수 있습니다.

나는 그것이 옵션이되고 싶지만 컬렉션이 순차적으로 읽혀질 때 이런 일이 발생하면 오류가 발생할 수 있습니다. 컬렉션을 읽는 동안 컬렉션의 내용을 잠그고 순차적 읽기가 끝난 후에 실행될 일정에 대한 제거 요청을 넣을 수 있기를 원합니다. 개체에 컬렉션에 대한 공용 액세스 권한이 없기 때문에 제거 요청이 시스템을 거쳐야합니다. isReading 플래그로 갈 수는 있지만 좀 더 우아한 구조가 있는지 궁금합니다.

C# 또는 .NET은이를 수행하는 도구를 제공합니까? 아마도 목록 내용을 잠그면 순차적으로 읽는 동안 제거 요청을 가로 챌 수 있습니까? 아니면이 시나리오에서 처음부터 그 동작을 구현해야합니까?

답변

0

당신은 다음 트릭

List<T> collection; 

for(int index = collection; index >= 0; --index) 
{ 
    var item = collection[index]; 

    if(MUST BE DELETED) 
    { 
    collection.RemoveAt(index); // this is faster 
    OR 
    collection.Remove(item); 
    } 
} 

이 코드를 수정 수집에 충돌하지 않으며, 수집

의 각 항목을 처리 할를 사용할 수 있습니다 또는

,이 질문에 대한 답을 살펴 가지고

+0

이 접근 방식은 "처음부터 구현"옵션으로 수행 할 계획입니다. RemoveAt가 더 빠르다는 것에주의하는 것이 유용하지만 오용을 방지하는 방식으로 "반드시 삭제해야합니다"라는 조건을 설정하는 우아한 방법에 대해 더 염려했습니다. – user1658867

+0

멋지고 명확하게 구현할 방법이 없습니다. 두 번째 해결 방법은 별도의 컬렉션에서 삭제해야하는 모든 항목을 저장하는 것입니다. 다음 루프에서 삭제하십시오. –

+0

제공된 코드는 매우 빠르고 안정적이며 수년간 사용하고 있습니다. –

관련 문제