В этом есть внутренняя проблема, потому что IEnumerator<T>
имеет как MoveNext()
, так и Current
. Вы действительно хотите один звонок, такой как:
bool TryMoveNext(out T value)
в этот момент вы можете атомно перейти к следующему элементу и получить значение. Реализовать это и все еще иметь возможность использовать yield
может быть сложно ... Я подумаю об этом, хотя. Я думаю, что вам нужно было бы обернуть «не поточный» итератор в потокобезопасный, который атомарно выполнял MoveNext()
и Current
для реализации интерфейса, показанного выше. Я не знаю, как бы вы обернули этот интерфейс обратно в IEnumerator<T>
, чтобы вы могли использовать его в foreach
, хотя ...
Если вы используете .NET 4.0, параллельные расширения могут помочь вам - вам нужно будет объяснить больше о том, что вы пытаетесь сделать.
Это интересная тема - возможно, мне придется написать об этом в блоге ...
РЕДАКТИРОВАТЬ: я сейчас написал об этом в блоге с двумя подходами.