(OBS: английский не является моим родным языком, и я понимаю, что название этого вопроса далеко от хорошего, но я изо всех сил старался прояснить сам вопрос)
Предположим, у меня есть IEnumerable<T> ts
, который имеет МНОГО элементов и каждый MoveNext () ОЧЕНЬ дорогой - скажем, ts
был сгенерирован с использованием метода yield return
, который делает дорогие вычисления.
Посмотрите на эту частькода:
var enumerator = ts.GetEnumerator();
while (true) {
T t = await TaskEx.Run<T>(() => enumerator.MoveNext() ?
enumerator.Current :
null);
if (t == null) break;
t.DoSomeLightweigthOperation();
}
Он использует коллекцию ts
асинхронно, без блокировки основного потока (который, в моем случае, является потоком пользовательского интерфейса).Проблема в том, что он порождает одну нить для каждого элемента в ts
.Есть ли (простой) способ сделать то же самое, используя только ОДИН поток, который выполняет всю работу?
Итак, чтобы прояснить ситуацию, я хочу сгенерировать эти элементы, используя только один поток, но мне нужночтобы получить какой-то набор Task
с (или любой другой класс с GetAwaiter
), чтобы я мог await
после генерации каждого из этих элементов.