【问题标题】:Running Multiple Linq Queries Async异步运行多个 Linq 查询
【发布时间】:2015-10-17 00:54:17
【问题描述】:

我正在尝试弄清楚如何在我的应用程序的数据层中正确使用async/await 来并行执行多个数据库调用。

我正在使用 Entity Framework 和 Linq 进行数据调用。

可以从任何应用程序类型(MVC Web 应用程序、Web API 项目、Win From、Windows 服务等)调用数据层 - 因此方法的结果应该是单个对象。

    public static async void GetLedger(long id, DateTime StartDate, DateTime EndDate)
    {
        var task_1 = DoComplexDBCallAsync1();
        var task_2 = DoComplexDBCallAsync2();
        var task_3 = DoComplexDBCallAsync3();
        var task_4 = DoComplexDBCallAsync4();
        var task_5 = DoComplexDBCallAsync5();

        await Task.WhenAll(task_1, task_2, task_3, task_4, task_5);

        var result = ProcessAndMergeResultsFromAllDBCalls(task_1.Result, task_2.Result, task_3.Result, task_4.Result, task_5.Result);

        return result;
    }

    private static async Task<List<SomeComplexType>> DoComplexDBCallAsync1(long id)
    {
        using (var metadata = DataAccess.getDesktopMetadata())
        {
            var accounts = await (from row in metadata.db_GLAccount
                                  where row.busID == id
                                  select row).ToListAsync();

            return accounts;
        }
    }

如何更改上述内容以返回单个 object 而不是 Task&lt;&gt;

我是否需要将其包装在另一个方法中,该方法通过Task run 或RunSynchronously() 调用GetLedger async 方法并返回结果? 如果是这样,代码的外观如何?我需要注意什么?

在这种情况下最佳做法是什么?

【问题讨论】:

  • 答案是你不知道。它应该返回 Task,而不是 void 或返回实际项目。这就是使它能够正确异步工作的原因。如果您希望它同步运行,那么只需使用同步 EF 代码创建一个完全同步的方法即可。
  • 没有。他们需要自己是异步的,并且能够看到这个方法是异步的。使用 await 可以更轻松地实现异步,但它仍然需要存在。

标签: c# linq asynchronous async-await entity-framework-6


【解决方案1】:

你会使用 await 如下

    public static async Task<SomeObject> GetLedger(long id, DateTime StartDate, DateTime EndDate)
    {
        var task_1 = DoComplexDBCallAsync1();
        var task_2 = DoComplexDBCallAsync2();
        var task_3 = DoComplexDBCallAsync3();
        var task_4 = DoComplexDBCallAsync4();
        var task_5 = DoComplexDBCallAsync5();

        var result = ProcessAndMergeResultsFromAllDBCalls(await task_1, await task_2, await task_3, await task_4, await task_5);

        return result;
    }

'await' 关键字会在 DB 调用返回时自动获取 Task 的结果并将其应用于变量。 MSDN

然后你会打电话

var result = await GetLedger(id, StartDate, EndDate);

一切都完成后才会继续。

【讨论】:

  • 您已将方法从并行执行所有 5 个 DB 操作的方法更改为按顺序执行所有操作的方法,并且所有迹象表明它们应该并行执行。他还特意问了如何让这个方法返回Task
  • 哎呀,对不起。我把 await 放在了错误的位置。已编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-30
  • 2018-11-06
  • 1970-01-01
相关资源
最近更新 更多