2013-02-24 33 views
5

Tôi muốn áp dụng chức năng async chờ đợi mới cho Thủ tục lưu trữ/Chức năng Nhập khẩu được nhập khẩu trong mô hình Entity của tôi, nhưng vẫn chưa thể với EF6 alpha. Có phải là có thể trong EF6 alpha2 (hoặc xây dựng hàng đêm là 20211) để gọi bất kỳ phương pháp mới nào của Async trên Nhập khẩu chức năng thực thể (gọi là thủ tục lưu trữ SQL) trả về một tập hợp Kiểu phức tạp không? Không. ví dụ.EF6 alpha Async Đang chờ trên Thủ tục lưu trữ thực thể/Nhập chức năng?

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" hoặc bất kỳ phương pháp sửa đổi không đồng bộ mới nào dường như không khả dụng cho Quy trình lưu trữ thực thể/chức năng được lưu trữ ở trên; chỉ có các phương thức "ToList" hoặc "AsNumerable" chuẩn có sẵn.

Tôi đã theo dõi điều này (http://entityframework.codeplex.com/wikipage?title=Updating%20Applications%20to%20use%20EF6) để đảm bảo mã đang tham chiếu EF6 dll mới và không phải EF5, cũng như cập nhật các câu lệnh sử dụng khác nhau. Bên cạnh đó, mọi thứ đều được xây dựng chính xác. (NET Framework 4.5)

Thời gian duy nhất tôi có thể xem các phương thức async là thay vì chỉ nhập các thủ tục lưu sẵn từ DB, tôi cũng nhập một bảng - khi tham chiếu bảng đó qua ngữ cảnh Entity như trên (context.SomeTable), một số phương thức async xuất hiện trong intellisense.

Tôi thực sự muốn bắt đầu sử dụng tính năng async mới đang chờ đợi chức năng trên nhiều Thủ tục được lưu trữ trước khi trả về dữ liệu dưới dạng JSON, nhưng chưa thể làm cho nó hoạt động cho đến thời điểm này.

Tôi có làm gì sai không? Có phải chức năng không đồng bộ không thể thực hiện được đối với nhập khẩu hàm/thủ tục được lưu trữ của Entity không? Cảm ơn lời khuyên của bạn.

+0

Loại 'context.customStoredProcedure (id)' tĩnh nào có? – usr

+0

Hệ thống.Data.Entity.Core.Objects.ObjectResult blueFish

+0

Bạn đã bao giờ làm việc đó chưa? Tôi có cùng một vấn đề với Proc được lưu trữ cần phải là ASYNC. –

Trả lời

4

Bây giờ điều này không phải là giải pháp tốt nhất. Tôi đã thêm một phương thức mở rộng để tôi có thể gọi chờ các thủ tục đã lưu trữ của mình. Trong các phiên bản mới hơn của EF6.1 + chúng ta sẽ thấy điều này được chính thức triển khai. Cho đến lúc đó một phương thức mở rộng giả thực hiện công việc.

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; 
} 

Nếu bạn phản ánh phiên bản 6 của EF bạn sẽ thấy rằng ObjectResult<T> thực sự thực hiện IDbAsyncEnumerable<T>, IDbAsyncEnumerable. Và phương pháp cho ToListAsync<T>(this IDbAsyncEnumerable<T> source) sẽ có thể kết nối nó giống như truy vấn LINQ.

Chỉnh sửa Khi ObjectResult rỗng trống được trả lại. Bạn có thể thêm if (source == null) return new List<T>(); nếu bạn muốn trả về một Danh sách trống thay vì null.

+4

Tạo ra một chuỗi mới với 'Task.Run' chỉ để bạn có thể" chờ đợi "một phương pháp hoàn toàn đánh bại mục đích của async/await. Bạn đã phát hành chuỗi chính của mình bằng cách đợi nhưng sau đó bạn chỉ sinh ra một chuỗi mới. Hiệu suất của bạn sẽ thực sự tồi tệ hơn khi bạn tính toán chi phí cho việc sinh ra luồng mới này và sau đó cuối cùng trở lại trên luồng chính khi bạn sinh ra hoàn thành. – TugboatCaptain

0

Đây là một chủ đề cũ, nhưng tôi cảm thấy mình nên chia sẻ. Bạn nên sử dụng APM sau đó bọc các cuộc gọi đồng bộ trong một Tác vụ.

Ví dụ:

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

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

Sau đó quấn phương pháp đồng bộ trong một công tác:

// 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); 
} 

Gọi phương pháp async khi bạn muốn thực hiện:

var MyResult = await MySPAsync(); 

Bạn có thể sử dụng lên đến ba (3) tham số trong các phương thức. Thực hành tốt nhất là nếu bạn sử dụng nhiều hơn ba tham số; bạn nên vượt qua trong một lớp học.

Các vấn đề liên quan