2013-02-24 3 views
5

Я хотел бы применить новую функцию ожидания async для сохраненных процедур/импортов функций, импортированных в мою модель Entity, но пока не удалось с альфа EF6.EF6 alpha Async Ожидание при сохранении объекта/функции импорта?

Возможно ли еще в EF6 alpha2 (или ночной сборке с 20211) вызвать любой из новых методов Async для функции Entity Function Import (который вызывает хранимую процедуру SQL), которая возвращает коллекцию сложного типа? например

private async Task<IList<Company>> getInfo (string id) 
{ 
    using (CustomEntity context = new CustomEntity()) 
    { 
     var query = await context.customStoredProcedure(id).ToListAsync(); 
     // ".ToListAsync()" method not available on above line 

     // OR ALTERNATIVELY 
     var query = await (from c in context.customStoredProcedure(id) 
          select new Company 
          { 
           Ident = c.id, 
           Name = c.name, 
           Country = c.country, 
           Sector = c.sector, 
           etc. etc.... 
          }).ToListAsync(); 
     // ".ToListAsync()" method or any "...Async" methods also not available this way 

     return query; 
    } 
} 

«ToListAsync», или любой из новых асинхронными модифицированных методов, кажется, не должны быть доступны для вышеуказанного лица хранимых процедур/функций импорта; доступны только стандартные методы «ToList» или «AsNumerable» и т. д.

Я следил за этим (http://entityframework.codeplex.com/wikipage?title=Updating%20Applications%20to%20use%20EF6), чтобы убедиться, что код ссылается на новые DLL EF6, а не EF5, а также обновил различные операторы. Помимо вышеизложенного, все строит правильно. (.NET Framework 4.5)

Единственный раз, когда я могу видеть методы async, заключается в том, что вместо того, чтобы импортировать хранимые процедуры из БД, я также импортирую таблицу - тогда, когда ссылаюсь на эту таблицу через контекст Entity, как указано выше (context.SomeTable), некоторые из асинхронных методов появляются в intellisense.

Я бы очень хотел начать использовать новую функцию асинхронного ожидания в нескольких хранимых процедурах до возвращения данных в виде JSON, но пока не смог заставить ее работать.

Я что-то не так? Является ли асинхронная функциональность невозможной для импорта хранимых процедур/функций Entity? Спасибо за ваш совет.

+0

Какой тип 'context.customStoredProcedure (id)' статически имеет? – usr

+0

Система.Data.Entity.Core.Objects.ObjectResult blueFish

+0

Вы когда-нибудь работали? У меня такая же проблема, что и Stored Proc, которая должна быть ASYNC. –

ответ

4

Теперь это далеко не лучшее решение. Я добавил метод расширения, чтобы я мог позвонить в мои хранимые процедуры. В новых версиях EF6.1 + мы должны увидеть, что это официально реализовано. До тех пор этот фиктивный метод расширения выполняет эту работу.

static async Task<List<T>> ToListAsync<T>(this ObjectResult<T> source) 
{ 
    var list = new List<T>(); 
    await Task.Run(() => list.AddRange(source.ToList())); 
    return list; 
} 

Если вы размышляете версии 6 ФВ вы увидите, что на самом деле ObjectResult<T> реализует IDbAsyncEnumerable<T>, IDbAsyncEnumerable. И метод для ToListAsync<T>(this IDbAsyncEnumerable<T> source) должен иметь возможность подключать его так же, как запрос LINQ.

Редактировать Когда ObjectResult пуст, возвращается null. Вы можете добавить if (source == null) return new List<T>();, если вы хотите вернуть пустой список вместо null.

+4

Истекает новый поток с 'Task.Run', чтобы вы могли« подождать », метод полностью побеждает цель async/await. Вы отпустили свой основной поток, ожидая, но потом вы просто породили новый поток. Ваша производительность будет на самом деле хуже, когда вы учитываете накладные расходы для нереста этого нового потока и затем, наконец, возобновляете основной, когда тот, который вы создали, завершается. – TugboatCaptain

0

Это старая нить, но я чувствовал, что должен поделиться. Вы должны использовать APM, а затем обернуть синхронные вызовы в Задаче.

Пример:

//declare the delegate 
private delegate MyResult MySPDelegate(); 

// declare the synchronous method 
private MyResult MySP() 
{ 
    // do work... 
} 

Затем оберните синхронный метод в задаче:

// wraps the method in a task and returns the task. 
public Task<MyResult> MySPAsync() 
{ 
    MySPDelegate caller = new MySPDelegate(MySP); 
    return Task.Factory.FromAsync(caller.BeginInvoke, caller.EndInvoke, null); 
} 

Вызовите метод асинхронной, когда вы хотите выполнить:

var MyResult = await MySPAsync(); 

Вы можете использовать до трех (3) параметров в методах. Лучшей практикой является использование более трех параметров; вы должны пройти в классе.