Как я могу заставить `await…` работать с `yield return` (т.е. внутри метода итератора)?
У меня есть существующий код, который выглядит примерно так:
IEnumerable 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;
}
}
}
Кажется, я мог бы извлечь выгоду, используяreader.ReadAsync()
, Однако, если я просто изменю одну строку:
while (await reader.ReadAsync())
компилятор сообщает мне, чтоawait
может использоваться только в методах, отмеченныхasync
и предлагает изменить сигнатуру метода так:
async Task GetStuff()
Однако это делаетGetStuff()
непригоден, потому что:
ТелоGetStuff()
не может быть блоком итератора, потому чтоTask
не является типом интерфейса итератора.
Я уверен, что мне не хватает ключевой концепции с моделью асинхронного программирования.
Вопросы:
Могу ли я использоватьReadAsync()
в моем итераторе? Как?Как я могу по-другому относиться к асинхронной парадигме, чтобы понять, как она работает в такой ситуации?