我试图并行运行三个数据库查询,但我不确定我这样做是正确的。
我做了三个函数,每个函数都对数据库进行查询。
private static async Task<string> 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<string> 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<string> 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 three tasks to make a new insert into the db.
我正在做的是实际上并行运行我的三个db查询吗?
编辑:
private static async Task<string> 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();
}
}
2条答案
按热度按时间nkcskrwz1#
你必须修改代码的最后一部分,使其并行运行:
注意,只有一个
await
。在原始代码中,您一个接一个地await
每个任务,使它们按顺序运行而不是并行运行。此外,方法
getAccountCodeAsync
等。并不是真正的Java方法(你应该得到一个编译器警告)。但是,Entity Framework 6支持Java操作,要使用它,您应该将FirstOrDefault
替换为FirstOrDefaultAsync
。对于每一个并行操作,您将不得不使用一个单独的上下文,而这正是您正在做的。cuxqih212#
不,它们一个接一个地运行,如果你用await foreach方法这样调用它们,它会运行第一个方法,然后第二个.最后一部分
await Task.WhenAll()
,你没有提供任务等待完成。要并行运行它们,您必须这样做: