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 sindasync
und 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?