2012-09-19 79 views

回答

6

EF 5沒有異步/等待支持,但開源版本正在積極尋找可能性。編輯:EF中的異步支持記錄在http://msdn.microsoft.com/en-us/data/jj819165.aspx。它不會將結果以流水作爲結果(就像您在RX中發現的那樣),但它確實使數據庫調用異步。

至於LINQ to SQL,除了在Task.Factory.Start操作中包裝你的請求之外,我不會屏住呼吸,希望基於任務的異步(async/await是必需的)將由Microsoft爲Linq實現到SQL。

您可以使用IQToolkit並在必要時添加自己的異步支持。此外,Mono已經實現了LINQ to SQL,您可以使用異步支持來擴展它。

3

Scott Hanselman有一個interesting post他演示瞭如何在現有的Linq to SQL查詢之上生成異步API。我沒有時間玩這個想法,但我猜測可以創建一個更通用的擴展方法,它允許將相同的技術擴展到IQueryable或IEnumerable類型的任何對象。

這裏是直接從他的帖子的代碼作爲參考。

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

通過一點點的工作,人們可以使這個TPL和同樣更清潔的單個異步方法。如果我有機會做到這一點,我會發布我的想法。