Многопоточность вопроса о сборе - PullRequest
0 голосов
/ 20 марта 2012

У меня проблема с многопоточностью в моем приложении.

Как часто в случае с многопоточностью, это не происходит постоянно.Иногда в этом коде возникает исключение 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 голосов
/ 20 марта 2012

Можете ли вы использовать .Net 4.0?
ConcurrentBag был бы лучшим типом для поддержки вашей коллекции, поэтому он безопасен для потоков.
В настоящее время вы блокируете дважды (_padLock и serie), но это не защищает вас от того, что кто-либо изменил коллекцию без блокировки.
Другой альтернативой может быть создание локальной копии коллекции и зацикливание вокруг этой копии, но это не устраняет гонку.

...