#c# #.net
Вопрос:
Мы знаем, что мы можем использовать yield return
для возврата элемента в методе итератора, например:
public IEnumerable<int> MyMethod(){
yield return 0;
...//Lots of code here;
yield return secondResu<//Just for illustration
}
public void Main(){
foreach(int i in MyMethod()){
DoSomething();
}
}
В коде, написанном выше , MyMethod()
остановится выполнение, когда когда-либо дойдет yield return
до запроса следующего результата foreach
, которым в данном случае является каждое завершение DoSomething()
.
Я думаю, что, поскольку DoSomething()
и MyMethod()
на самом деле независимы друг от друга, можно сделать так, чтобы они выполнялись параллельно. Это было бы все более значительным, если бы эти два метода были массивными для расчетов.
Что я пытаюсь сделать, чтобы это выглядело так:
public IEumerable<int> MyMethod(){
Task<int> task = GetNextAsync();//Prepare for next return
yield return 0;
yield return await task;
}
Это так хорошо? Есть ли что-то не так или с чем мне следует быть осторожным?
Комментарии:
1. Вы не можете использовать
await
несинхронный метод.2. dotnetcoretutorials.com/2019/01/09/iasyncenumerable-in-c-8 IAsyncEnumerable здесь будет работать лучше.
3. Какова реальная цель? Блоки итераторов использовались (пропускались)в качестве формы совместной работы. Но сегодня задачи/асинхронные/ожидающие в основном выполняют ту же цель лучше. Если вы не используете результаты
MyMethod
, возможно, есть какой-то другой шаблон, который лучше подходит.4.
async
и паралелизм — это две разные вещи. Ни то, ни другое не подразумевает другого.
Ответ №1:
Это так хорошо?
Нет, потому что он не будет компилироваться.
Вы пытаетесь реализовать асинхронный итератор, который должен возвращать IAsyncEnumerable<T>
значение , а также использовать async
ключевое слово для включения await
:
public async IAsyncEnumerable<int> MyMethodAsync()
{
Task<int> task = GetNextAsync();//Prepare for next return
yield return 0;
yield return await task;
}
Есть ли что-то не так или с чем мне следует быть осторожным?
Только то, что это нужно потреблять с использованием await foreach
, а не стандартного foreach
:
await foreach (var i in MyMethodAsync())
Или вы можете использовать System.Linq.Асинхронный