2017-01-13 7 views

ответ

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, а не при перечислении результатов.

+1

Почему нет, ждут Task.Run (() => ObjectContext.ExecuteFunction ... (синхронный код)? –

+0

Потому что это бессмысленный код. Какой смысл начинать новую задачу и ждать ее? Это будет гораздо меньше чтобы просто использовать метод синхронно. Помните, что если вы хотите получить какую-либо выгоду от асинхронного программирования, вы должны использовать порты завершения ввода-вывода ->, которые используют асинхронные версии функций, которые предоставляет вам инфраструктура. –

+0

спасибо, я теперь использую SqlQuery для извлечения моего пакета хранилища данных proc, но как я могу получить следующий набор данных внутри одного и того же магазина с этим соглашением? –