运行多个Linq查询异步

时间:2015-10-16 16:12:45

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

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

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

可以从任何应用程序类型(MVC Web App,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<>

我是否需要将其包装在另一个通过GetLedger运行或Task调用RunSynchronously()异步方法的方法中并返回结果? 如果是这样,代码看起来怎么样,有什么我需要注意的吗?

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

1 个答案:

答案 0 :(得分:-1)

您将使用等待如下

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

等待&#39;关键字将自动获取任务的结果,并在数据库调用返回时将其应用于变量。 indexOf

然后你会打电话给

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

将在一切都完成后继续。