并行运行多个EntityFramework数据库查询

我试图并行运行3个db查询,但我不确定我是否正确执行。

我已经制作了3个函数,每个函数都对db进行查询。

private static async Task getAccountCodeAsync(string deviceId) { long deviceIdLong = long.Parse(deviceId); using (var db = new NetworksEntities()) { return db.Devices.Where(x => x.DeviceId == deviceIdLong).Select(x => x.AccountCode).FirstOrDefault(); } } private static async Task getDeviceTypeAsync(string deviceId) { long deviceIdLong = long.Parse(deviceId); using (var db = new NetworksEntities()) { return db.Devices.Where(x => x.DeviceId == deviceIdLong).Select(x => x.DeviceType).FirstOrDefault().DeviceType; } } private static async Task getUserNameAsync(string userId) { int userIdInt; Int32.TryParse(userId, out userIdInt); using (var db = new NetworksEntities()) { return db.Users.Where(x => x.UserId == userIdInt).Select(x => x.Email).FirstOrDefault(); } } 

然后我在我的代码中运行三个任务:

  var TaskAccountCode = await getAccountCodeAsync(deviceId); var TaskDeviceType = await getDeviceTypeAsync(deviceId); var TaskUsername = await getUserNameAsync(userId); await Task.WhenAll(); //use the results from my 3 tasks to make a new insert into the db. 

我正在做什么实际上并行运行我的3 db查询?

编辑:

  private static async Task getAccountCodeAsync(string deviceId) { long deviceIdLong = long.Parse(deviceId); using (var db = new NetworksEntities()) { return db.Devices.Where(x => x.DeviceId == deviceIdLong).Select(x => x.AccountCode).FirstOrDefaultAsync(); } } 

您将不得不更改代码的最后一部分以使其并行运行:

 var taskAccountCode = getAccountCodeAsync(deviceId); var taskDeviceType = getDeviceTypeAsync(deviceId); var taskUsername = getUserNameAsync(userId); await Task.WhenAll(taskAccountCode, taskDeviceType, taskUsername); var accountCode = taskAccountCode.Result; var deviceType = taskDeviceType.Result; var username = taskUsername.Result; 

请注意,只有一个await 。 在原始代码中,您将依次await每个任务,使它们按顺序而不是并行运行。

此外, getAccountCodeAsync等方法并不是真正的异步方法(您应该收到编译器警告)。 但是,Entity Framework 6支持异步操作并使用它,您应该将FirstOrDefault替换为FirstOrDefaultAsync 。 对于每个并行操作,您将必须使用单独的上下文,这正是您正在做的事情。

如果你使用await foreach方法调用它们,它们会先运行第一个方法,然后运行第二个方法…… 最后一部分await Task.WhenAll() ,你没有提供等待完成的任务。

要并行运行它们,你必须这样做:

 var TaskAccountCode = getAccountCodeAsync(deviceId); var TaskDeviceType = getDeviceTypeAsync(deviceId); var TaskUsername = getUserNameAsync(userId); await Task.WhenAll(TaskAccountCode, TaskDeviceType,TaskUsername);