2012-03-20 1 views
0

내 응용 프로그램에서 스레딩 문제가 있습니다.컬렉션의 멀티 스레딩 문제

종종 스레드 문제로 인해 항상 발생하지 않습니다. 는 때때로 collectionChanged 예외는이 코드에 발생

SyncLock _padLock 
     System.Threading.Monitor.Enter(serie) 
     For Each dat In serie.Lignes 
      WriteLine(dat.Columns(), False, 0, False)'exception here 
     Next 
     System.Threading.Monitor.Exit(serie) 
    End SyncLock 

는 기본적으로 세리 객체의 배열 인 라인을 포함한다.

해당 객체에 모니터 잠금 기능이있는 경우 왜 다른 스레드가 시리즈를 수정할 수 있습니까?

또한 섹션이 VS에 잠겨있는 것을 볼 수있는 것 같습니다. 특정 방법으로 그렇게 할 수 있습니까?

편집 : 잠금이 제대로 수행되도록

나는 코드를 수정했습니다. 그 버그는 사라졌습니다. 하지만 지금은 다른 버그를 찾아내려고합니다. 이 코드는 매우 까다 롭습니다. 때로는 예기치 않은 결과 (인종 때문에)가 발생하기도하지만 코드에 중단 점이있을 때 코드를 재생산 할 수 없기 때문입니다.

이것은 정말 털이 많은 상황입니다.

+1

컬렉션을 수정하는 코드도 동기화 되었습니까? (예 : 잠금을 위해 동일한 객체를 사용하고 있습니까?) –

+0

아니요, 컬렉션을 수정하는 코드가 동기화되지 않았습니다. 하지만 개체를 ​​잠그면 하나의 스레드 만 액세스 할 수 있어야합니까? – squelos

+0

@squelos - 잠금이 * 객체 *를 보호하지 않으면 코드 블록 *을 투영합니다. 따라서 "serie"또는 "serie.Lignes"를 수정할 수있는 모든 코드 블록을 동일한 객체 *의 잠금 장치 *에 넣어야합니다. –

답변

0

.Net 4.0을 사용할 수 있습니까?
ConcurrentBag가 콜렉션을 지원하는 더 나은 유형이 G로 스레드 세이프입니다.
현재 두 번 (_padLock 및 세리) 잠그고 있지만 잠금을 사용하지 않고 컬렉션을 수정하는 사람을 보호 할 수는 없습니다.
다른 방법으로는이 복사본 주위에 컬렉션 및 루프의 로컬 복사본을 만들 수 있지만 이것이 레이스를 제거하지는 않습니다.

+0

예 .net 4.0을 사용할 수 있습니다. 아프다. 임 스레딩에 익숙하지 않습니다. – squelos