.NET - многопоточная итерация по одному списку (Of T) - на что мне нужно обращать внимание? - PullRequest
2 голосов
/ 22 октября 2009

Я использую VB.NET.

Я хочу создать большой список (Of MyClassOrStructure), который становится статичным после первоначального заполнения.

У меня будет несколько потоков, которым нужно перебирать этот список для чтения данных (без записи, вставки или удаления)

Есть ли какие-то очень плохие вещи, за которыми мне нужно следить?

Спасибо.

Ответы [ 3 ]

5 голосов
/ 22 октября 2009

Если вы просто читаете, у вас все хорошо. Каждый итератор будет независим от других.

Если вы когда-нибудь задумывались, почему интерфейс IEnumerable<T> не имеет непосредственно MoveNext() и Current, а вместо этого должен создать экземпляр IEnumerator<T>, поэтому - сам список не сохраняет «курсор», говорящий о том, где находится итератор, находится в IEnumerator<T>. Совместное использование значений IEnumerator<T> между потоками почти наверняка будет плохой идеей, но вы вряд ли сделаете это случайно. Естественный способ итерации в нескольких потоках будет иметь один IEnumerator<T> на поток, что является безопасным (до тех пор, пока вы не измените список).

1 голос
/ 22 октября 2009

Если значения являются статическими, я не вижу необходимости в блокировке, но если это когда-либо происходило, вы редко пишете объекту, вы можете посмотреть на ReaderWriterLock Class

0 голосов
/ 22 октября 2009

вам, очевидно, нужна какая-то блокировка, если задействованы как чтение, так и запись. лучший подход - использовать блокировку чтения-записи. см. ReaderWriterLockSlim .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...