【发布时间】:2012-09-19 16:02:15
【问题描述】:
与this 方法相比,将 L2S 与新的 C# 5 async/await 关键字一起使用的最佳实践是什么?网上找不到。
【问题讨论】:
-
也许可以创建一些包装器或其他东西?顺便说一句,最新的 EF 是否支持 async/await?
标签: .net linq-to-sql .net-4.5 async-await
与this 方法相比,将 L2S 与新的 C# 5 async/await 关键字一起使用的最佳实践是什么?网上找不到。
【问题讨论】:
标签: .net linq-to-sql .net-4.5 async-await
EF 5 没有 async/await 支持,但开源版本正在积极探索这里的可能性。编辑:EF 中的异步支持记录在http://msdn.microsoft.com/en-us/data/jj819165.aspx。它不会在结果被水合时将结果流式传输(正如您在 RX 中会发现的那样),但它确实使数据库调用异步。
至于 LINQ to SQL,除了将您的请求包装在 Task.Factory.Start 操作中之外,我不会屏住呼吸,希望 Microsoft 为 Linq 实现基于任务的异步(异步/等待所需)以SQL。
如果绝对必要,您可以使用IQToolkit 并扩展它添加您自己的异步支持。此外,Mono 已经实现了 LINQ to SQL,您可以通过异步支持对其进行扩展。
【讨论】:
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 变得更简洁,并且作为一个单一的异步方法。如果我有机会这样做,我会发布我的想法。
【讨论】: