В EF 6 я хотел бы асинхронно обрабатывать объекты по мере их возврата из механизма базы данных.Асинхронно обрабатывать объекты, поскольку они возвращаются из механизма базы данных.
Я знаю, что могу позвонить ToListAsync()
и ForEachAsync()
и, возможно, они делают то, что ищу, но я не уверен. Я думаю, что я ищу, это сочетание двух.
С моей точки зрения, ToListAsync()
выполнит задачу, когда весь запрос будет прочитан из механизма базы данных и преобразован в объекты. Это означает, что вам нужно дождаться возврата всего запроса до начала процесса.
Я не могу определить, выполняет ли ForEachAsync()
то, что я ищу, но то, что я предполагаю, из-за отсутствия информации в другом месте, заключается в том, что ForEachAsync()
просто работает с уже полученной коллекцией, и обработка каждого элемента асинхронна ,
Что было бы идеальным, так это то, что ForEachAsync()
(или другой, но неизвестный метод) вызовет задачу, поскольку данные извлекаются из механизма базы данных.
Итак, действительно ли это ForEachAsync()
, а если нет, есть ли способ для этого?
Причины желания этого являются два аспекта:
- Большие запросы не должны быть сохранены в памяти, как и весь коллекции, так что экономия объема памяти и способности обрабатывать гораздо больше результирующих не ограничен памятью
- продолжительность всего процесса , вероятно, будет короче, за счет обработки каждого элемента во время латентности поиска данных
Обновление: В принципе, если DbContext
поднял событие, например, OnEntityLoaded
для каждого объекта, когда вы позвонили LoadAsync()
, я мог бы выполнить все, что захочу. Поскольку я мог бы просто вставить объект в отдельный процессор задач, и сущности могли бы эффективно обрабатываться и использовать любую задержку ввода-вывода. Я всегда могу настроить отдельный процессор задач, поэтому мне не нужен EF для поддержки асинхронной обработки сущностей, просто асинхронно загружать и запускать событие/вызывать делегат при загрузке каждого объекта.
Обновление 2: И если ForEachAsync()
было вызвано, как сущности загружались, то это также выполнило бы то, что я хочу.
Итак, вы ищете что-то, что автоматически извлекает элементы из базы данных в кусках или по одному за раз? Как правило, запрос EF вытаскивает несколько элементов из базы данных в одном запросе БД. – JLRishe
Да, это именно то, что я ищу. В результате я хотел бы, чтобы асинхронный считыватель данных (например, SqlDataReader) асинхронно испускал/обрабатывал объекты. Я мог бы написать что-то с async SqlDataReader, но я хотел бы, чтобы он использовал объекты EF6 и работал в EF6. – MikeJansen
@JLRishe, я добавил редактирование вопроса, чтобы уточнить. – MikeJansen