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