Как я могу заставить `await…` работать с `yield return` (т.е. внутри метода итератора)?

У меня есть существующий код, который выглядит примерно так:

IEnumerable GetStuff()
{
    using (SqlConnection conn = new SqlConnection(connectionString))
    using (SqlCommand cmd = new SqlCommand(sql, conn)
    {
        conn.Open();
        SqlDataReader reader = cmd.ExecuteReader();
        while (reader.Read())
        {
            SomeClass someClass = f(reader); // create instance based on returned row
            yield return someClass;
        }
    } 
}

Кажется, я мог бы извлечь выгоду, используяreader.ReadAsync(), Однако, если я просто изменю одну строку:

        while (await reader.ReadAsync())

компилятор сообщает мне, чтоawait может использоваться только в методах, отмеченныхasyncи предлагает изменить сигнатуру метода так:

async Task GetStuff()

Однако это делаетGetStuff() непригоден, потому что:

ТелоGetStuff() не может быть блоком итератора, потому чтоTask не является типом интерфейса итератора.

Я уверен, что мне не хватает ключевой концепции с моделью асинхронного программирования.

Вопросы:

Могу ли я использоватьReadAsync() в моем итераторе? Как?Как я могу по-другому относиться к асинхронной парадигме, чтобы понять, как она работает в такой ситуации?

Ответы на вопрос(3)

Ваш ответ на вопрос