¿Cómo puedo hacer que `espere ...` funcione con `rendimiento? '(Es decir, dentro de un método de iterador)?

Tengo un código existente que se parece a:

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

Parece que podría beneficiarme usandoreader.ReadAsync(). Sin embargo, si solo modifico una línea:

        while (await reader.ReadAsync())

el compilador me informa queawait&nbsp;Solo se puede utilizar en métodos marcados conasync, y sugiere que modifique la firma del método para que sea:

async Task<IEnumerable<SomeClass>> GetStuff()

Sin embargo, hacer eso haceGetStuff()&nbsp;inutilizable porque:

El cuerpo deGetStuff()&nbsp;no puede ser un bloque iterador porqueTask<IEnumerable<SomeClass>>&nbsp;no es un tipo de interfaz iterador.

Estoy seguro de que me estoy perdiendo un concepto clave con el modelo de programación asíncrono.

Preguntas:

Puedo usarReadAsync()&nbsp;en mi iterador? ¿Cómo?¿Cómo puedo pensar en el paradigma asíncrono de manera diferente para entender cómo funciona en este tipo de situación?