私のアプリケーションでスレッド化に問題があります。コレクションのマルチスレッドに関する問題
多くの場合、スレッドの問題では、常に発生しません。 時々て、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つのスレッドのみにアクセスを許可する必要がありますか? – squelos
@squelos - ロックはオブジェクト*を保護しません。*コードブロック*を投影します。したがって、同じオブジェクトのロック*内で "serie"または "serie.Lignes"を変更できるすべてのコードブロックをラップする必要があります*。 –