2012-09-19 23 views

Trả lời

6

EF 5 không có hỗ trợ không đồng bộ/đang chờ, nhưng phiên bản nguồn mở đang tích cực xem xét các khả năng tại đây. EDIT: hỗ trợ Async trong EF được ghi nhận tại http://msdn.microsoft.com/en-us/data/jj819165.aspx. Nó không truyền các kết quả khi chúng được ngậm nước (như bạn sẽ thấy với RX) nhưng nó làm cho cơ sở dữ liệu gọi không đồng bộ.

Đối với LINQ to SQL, bên ngoài gói yêu cầu của bạn trong một hoạt động Task.Factory.Start, tôi sẽ không giữ hơi thở của tôi hy vọng rằng nhiệm vụ dựa async (yêu cầu cho async/await) sẽ được thực hiện bởi Microsoft cho LINQ đến SQL.

Bạn có thể sử dụng IQToolkit và mở rộng thêm hỗ trợ async của riêng bạn nếu cần thiết. Ngoài ra, Mono đã triển khai LINQ to SQL mà bạn có thể mở rộng bằng hỗ trợ async.

3

Scott Hanselman có một số interesting post nơi ông chứng minh cách người ta có thể tạo ra một API không đồng bộ trên đầu trang của truy vấn LINQ to SQL hiện có. Tôi không có thời gian để chơi xung quanh với ý tưởng nhưng tôi đoán rằng người ta có thể tạo ra một phương pháp mở rộng chung chung hơn mà sẽ cho phép cùng một kỹ thuật được mở rộng đến bất kỳ đối tượng của loại IQueryable hoặc IEnumerable.

Đây là mã trực tiếp từ bài đăng của anh ấy để sử dụng làm tài liệu tham khảo.

SqlCommand _beginFindCmd = null; 

public IAsyncResult BeginFind(int id, AsyncCallback callback, Object asyncState) 
{ 
    var query = from w in _db.Widgets 
       where w.Id == id 
       select w; 
    _beginFindCmd = _db.GetCommand(query) as SqlCommand; 
    _db.Connection.Open(); 
    return _beginFindCmd.BeginExecuteReader(callback, asyncState, System.Data.CommandBehavior.CloseConnection); 
} 

public Widget EndFind(IAsyncResult result) 
{ 
    var rdr = _beginFindCmd.EndExecuteReader(result); 
    var widget = (from w in _db.Translate<Widget>(rdr) 
        select w).SingleOrDefault(); 
    rdr.Close(); 
    return widget; 
} 

Với một chút công việc, người ta có thể làm cho TPL này và thậm chí còn sạch hơn như một phương pháp không đồng bộ. Nếu tôi có cơ hội để làm điều này, tôi sẽ đăng những gì tôi nghĩ ra.