【问题标题】:Using Linq to Sql asynchronously with new async/await使用新的 async/await 异步使用 Linq to Sql
【发布时间】:2012-09-19 16:02:15
【问题描述】:

this 方法相比,将 L2S 与新的 C# 5 async/await 关键字一起使用的最佳实践是什么?网上找不到。

【问题讨论】:

  • 也许可以创建一些包装器或其他东西?顺便说一句,最新的 EF 是否支持 async/await?

标签: .net linq-to-sql .net-4.5 async-await


【解决方案1】:

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,您可以通过异步支持对其进行扩展。

【讨论】:

    【解决方案2】:

    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 变得更简洁,并且作为一个单一的异步方法。如果我有机会这样做,我会发布我的想法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-04
      • 2015-12-19
      • 2019-01-17
      • 2013-04-11
      • 1970-01-01
      • 2014-03-16
      • 2015-03-16
      • 2016-09-03
      相关资源
      最近更新 更多