Jak mogę wykonać `oczekiwanie…` działa z `return return` (tj. Wewnątrz metody iteratora)?

Mam istniejący kod, który wygląda podobnie do:

IEnumerable<SomeClass> 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;
        }
    } 
}

Wygląda na to, że mógłbym skorzystać z używaniareader.ReadAsync(). Jeśli jednak zmodyfikuję tylko jedną linię:

        while (await reader.ReadAsync())

kompilator informuje mnie o tymawait&nbsp;może być używany tylko w metodach oznaczonych symbolemasynci sugeruje, że zmodyfikuję podpis metody, aby był:

async Task<IEnumerable<SomeClass>> GetStuff()

Jednak robi toGetStuff()&nbsp;bezużyteczny, ponieważ:

CiałoGetStuff()&nbsp;nie może być blokiem iteracyjnym, ponieważTask<IEnumerable<SomeClass>>&nbsp;nie jest typem interfejsu iteratora.

Jestem pewien, że brakuje mi kluczowej koncepcji z modelem programowania async.

Pytania:

Mogę uzyćReadAsync()&nbsp;w moim iteratorze? W jaki sposób?Jak inaczej myśleć o paradygmacie asynchronicznym, aby zrozumieć, jak działa w tego typu sytuacji?