¿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
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()
inutilizable porque:
El cuerpo deGetStuff()
no puede ser un bloque iterador porqueTask<IEnumerable<SomeClass>>
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()
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?