Использование Entity Framework 6 с webpi asp.net и сопоставление с хранимой процедурой как преобразовать метод выполнения ObjectContext
в задачу async?ObjectContext ExecuteFunction с задачей async
0
A
ответ
0
В качестве альтернативы ExecuteFunction можно использовать следующие построения, который обеспечит вам асинхронного выполнения:
Task<SomeResult[]> results = ctx.Database.SqlQuery<SomeResult>("EXEC sp_myproc {0}, {1}, {2}", p1, p2, p3).ToArrayAsync();
или:
SomeResult[] results = await ctx.Database.SqlQuery<SomeResult>("EXEC sp_myproc {0}, {1}, {2}", p1, p2, p3).ToArrayAsync();
Если вам нужно использовать метод ExecuteFunction вы могли попробуйте это:
IDbAsyncEnumerable<SomeResult> enumerable = this.ExecuteFunction<SomeResult>("sp_myproc", p1, p2, p3) as IDbAsyncEnumerable<SomeResult>;
IDbAsyncEnumerator<SomeResult> enumerator = enumerable.GetAsyncEnumerator();
while (await enumerator.MoveNextAsync(CancellationToken.None))
{
SomeResult res = enumerator.Current;
...
}
Это, как говорится, стоит того что если вы решите использовать метод ExecuteFunction, фактический оператор SQL будет работать на линии ExecuteFunction
, а не при перечислении результатов.
Почему нет, ждут Task.Run (() => ObjectContext.ExecuteFunction ... (синхронный код)? –
Потому что это бессмысленный код. Какой смысл начинать новую задачу и ждать ее? Это будет гораздо меньше чтобы просто использовать метод синхронно. Помните, что если вы хотите получить какую-либо выгоду от асинхронного программирования, вы должны использовать порты завершения ввода-вывода ->, которые используют асинхронные версии функций, которые предоставляет вам инфраструктура. –
спасибо, я теперь использую SqlQuery для извлечения моего пакета хранилища данных proc, но как я могу получить следующий набор данных внутри одного и того же магазина с этим соглашением? –