2012-03-20 14 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

いいえ、コレクションを変更しているコードは同期していません。しかし、私はオブジェクトをロックする場合は、1つのスレッドのみにアクセスを許可する必要がありますか? – squelos

+0

@squelos - ロックはオブジェクト*を保護しません。*コードブロック*を投影します。したがって、同じオブジェクトのロック*内で "serie"または "serie.Lignes"を変更できるすべてのコードブロックをラップする必要があります*。 –

答えて

0

.Net 4.0を使用できますか?
ConcurrentBagはコレクションをサポートするより優れた型であるため、スレッドセーフです。
現在、ロックを2回(_padLockとセリフ)していますが、ロックしないでコレクションを変更しているユーザーに対しては保護されません。
このコピーの周りにコレクションとループのローカルコピーを作成することもできますが、これでレースが削除されるわけではありません。

+0

はい、私は.net 4.0を使用できます。病気の周りを見ている。私は本当にスレッドに精通していません。 – squelos

関連する問題