2012-09-19 64 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和同样更清洁的单个异步方法。如果我有机会做到这一点,我会发布我的想法。