【发布时间】: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<>?
我是否需要将其包装在另一个方法中,该方法通过Task run 或RunSynchronously() 调用GetLedger async 方法并返回结果?
如果是这样,代码的外观如何?我需要注意什么?
在这种情况下最佳做法是什么?
【问题讨论】:
-
答案是你不知道。它应该返回
Task,而不是void或返回实际项目。这就是使它能够正确异步工作的原因。如果您希望它同步运行,那么只需使用同步 EF 代码创建一个完全同步的方法即可。 -
没有。他们需要自己是异步的,并且能够看到这个方法是异步的。使用
await可以更轻松地实现异步,但它仍然需要存在。
标签: c# linq asynchronous async-await entity-framework-6