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