Можно ли так писать о доходности?

#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.Асинхронный