Wie kann ich "wait ..." mit "yield return" arbeiten lassen (d. H. Innerhalb einer Iteratormethode)?

Ich habe vorhandenen Code, der ungefähr so ​​aussieht:

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

Es scheint, dass ich durch die Verwendung von profitieren könntereader.ReadAsync(). Wenn ich jedoch nur die eine Zeile ändere:

        while (await reader.ReadAsync())

Der Compiler informiert mich darüberawait kann nur in Methoden verwendet werden, die mit gekennzeichnet sindasyncund schlägt vor, dass ich die Methodensignatur ändere, um:

async Task<IEnumerable<SomeClass>> GetStuff()

Allerdings macht dasGetStuff() unbrauchbar, weil:

Der Körper vonGetStuff() kann kein Iteratorblock sein, weilTask<IEnumerable<SomeClass>> ist kein Iterator-Schnittstellentyp.

Ich bin sicher, ich vermisse ein Schlüsselkonzept mit dem asynchronen Programmiermodell.

Fragen:

Kann ich benutzenReadAsync() in meinem Iterator? Wie?Wie kann ich das asynchrone Paradigma anders betrachten, um zu verstehen, wie es in einer solchen Situation funktioniert?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage