asp.net 并行运行多个AlertyFramework数据库查询

qv7cva1a  于 2023-10-21  发布在  .NET
关注(0)|答案(2)|浏览(131)

我试图并行运行三个数据库查询,但我不确定我这样做是正确的。
我做了三个函数,每个函数都对数据库进行查询。

  1. private static async Task<string> getAccountCodeAsync(string deviceId)
  2. {
  3. long deviceIdLong = long.Parse(deviceId);
  4. using (var db = new NetworksEntities())
  5. {
  6. return db.Devices.Where(x => x.DeviceId == deviceIdLong)
  7. .Select(x => x.AccountCode)
  8. .FirstOrDefault();
  9. }
  10. }
  11. private static async Task<string> getDeviceTypeAsync(string deviceId)
  12. {
  13. long deviceIdLong = long.Parse(deviceId);
  14. using (var db = new NetworksEntities())
  15. {
  16. return db.Devices.Where(x => x.DeviceId == deviceIdLong)
  17. .Select(x => x.DeviceType)
  18. .FirstOrDefault()
  19. .DeviceType;
  20. }
  21. }
  22. private static async Task<string> getUserNameAsync(string userId)
  23. {
  24. int userIdInt;
  25. Int32.TryParse(userId, out userIdInt);
  26. using (var db = new NetworksEntities())
  27. {
  28. return db.Users.Where(x => x.UserId == userIdInt)
  29. .Select(x => x.Email)
  30. .FirstOrDefault();
  31. }
  32. }

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

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

我正在做的是实际上并行运行我的三个db查询吗?
编辑:

  1. private static async Task<string> getAccountCodeAsync(string deviceId)
  2. {
  3. long deviceIdLong = long.Parse(deviceId);
  4. using (var db = new NetworksEntities())
  5. {
  6. return db.Devices.Where(x => x.DeviceId == deviceIdLong)
  7. .Select(x => x.AccountCode)
  8. .FirstOrDefaultAsync();
  9. }
  10. }
nkcskrwz

nkcskrwz1#

你必须修改代码的最后一部分,使其并行运行:

  1. var taskAccountCode = getAccountCodeAsync(deviceId);
  2. var taskDeviceType = getDeviceTypeAsync(deviceId);
  3. var taskUsername = getUserNameAsync(userId);
  4. await Task.WhenAll(taskAccountCode, taskDeviceType, taskUsername);
  5. var accountCode = taskAccountCode.Result;
  6. var deviceType = taskDeviceType.Result;
  7. var username = taskUsername.Result;

注意,只有一个await。在原始代码中,您一个接一个地await每个任务,使它们按顺序运行而不是并行运行。
此外,方法getAccountCodeAsync等。并不是真正的Java方法(你应该得到一个编译器警告)。但是,Entity Framework 6支持Java操作,要使用它,您应该将FirstOrDefault替换为FirstOrDefaultAsync。对于每一个并行操作,您将不得不使用一个单独的上下文,而这正是您正在做的。

cuxqih21

cuxqih212#

不,它们一个接一个地运行,如果你用await foreach方法这样调用它们,它会运行第一个方法,然后第二个.最后一部分await Task.WhenAll(),你没有提供任务等待完成。
要并行运行它们,您必须这样做:

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

相关问题