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

Zap*_*ica 15 c# asp.net multithreading asynchronous task-parallel-library

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

我已经创建了3个函数,每个函数都对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)
            .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();
    }
}   
Run Code Online (Sandbox Code Playgroud)

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

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.
Run Code Online (Sandbox Code Playgroud)

我正在做什么实际上并行运行我的3 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*age 17

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

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;
Run Code Online (Sandbox Code Playgroud)

请注意,只有一个await.在原始代码中,await每个任务一个接一个地按顺序运行而不是并行运行.

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