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
może być używany tylko w metodach oznaczonych symbolemasync
i sugeruje, że zmodyfikuję podpis metody, aby był:
async Task<IEnumerable<SomeClass>> GetStuff()
Jednak robi toGetStuff()
bezużyteczny, ponieważ:
CiałoGetStuff()
nie może być blokiem iteracyjnym, ponieważTask<IEnumerable<SomeClass>>
nie jest typem interfejsu iteratora.
Jestem pewien, że brakuje mi kluczowej koncepcji z modelem programowania async.
Pytania:
Mogę uzyćReadAsync()
w moim iteratorze? W jaki sposób?Jak inaczej myśleć o paradygmacie asynchronicznym, aby zrozumieć, jak działa w tego typu sytuacji?