并行任务代码,使多个数据库访问
本文关键字:数据库 访问 代码 并行任务 | 更新日期: 2023-09-27 17:53:17
我正在尝试加快我的一些代码,
我对一个慢速数据库进行2或3次读取,我想让这些调用并行运行。
FSKWebInterfaceEntities dbSrc = new FSKWebInterfaceEntities();
public void main()
{
var TaskUsr = GetUserAsync(dev);
var TaskOldCompany = GetOldCompanyAsync(dev);
await Task.WhenAll();
var usr = TaskUsr.Result;
var oldCompanyName = TaskOldCompany.Result;
.....
use my two variables to insert a new entry into my localdb
}
private async Task<ut_User> GetUserAsync(ut_UserAPNdevices dev)
{
return dbSrc.ut_User.FirstOrDefault(x => x.UserID == dev.UserID);
}
private async Task<String> GetOldCompanyAsync(ut_UserAPNdevices dev)
{
return dbSrc.ut_User.FirstOrDefault(x => x.UserID == dev.UserID).Company;
}
在我的两个助手方法中,用绿色下划线表示,表示没有等待,因此将同步运行。但是我不能返回return await dbSrc.ut_User.FirstOrDefault(x => x.UserID == dev.UserID);
我应该如何修改我的代码,使两个读取并行?
您可以等待该行,因为它不是异步方法。您不能真正等待数据库调用,因为它们不是线程安全的。查看这个线程的一个例子,一种方法做到这一点,并更好地解释为什么不。
不能同时使用同一个EF DbContext
。EF团队关于线程安全的声明:
目前,EF将检测开发人员是否试图执行同时进行两个异步操作并抛出。
您仍然可以异步调用它们,但是顺序调用:
public async Task main()
{
var sr = await GetUserAsync(dev);
var oldCompany = await GetOldCompanyAsync(dev);
.....
use my two variables to insert a new entry into my localdb
}
更新以解决注释:
你可以贴一个简单的例子,我将如何改变我的上面的代码使用多个dbcontext,因为我真的不知道如果没有正确的方法,我就会在黑暗中编码。
如下所示。我不是EF的专家,不能向你保证这实际上会缩短处理时间。为每个上下文打开数据库连接可能会有很大的开销。
public async Task main()
{
var TaskUsr = GetUserAsync(dev);
var TaskOldCompany = GetOldCompanyAsync(dev);
await Task.WhenAll(TaskUsr, TaskOldCompany);
var usr = TaskUsr.Result;
var oldCompanyName = TaskOldCompany.Result;
.....
use my two variables to insert a new entry into my localdb
}
private async Task<ut_User> GetUserAsync(ut_UserAPNdevices dev)
{
using (var dbSrc = new FSKWebInterfaceEntities())
return dbSrc.ut_User.FirstOrDefault(x => x.UserID == dev.UserID);
}
private async Task<String> GetOldCompanyAsync(ut_UserAPNdevices dev)
{
using (var dbSrc = new FSKWebInterfaceEntities())
return dbSrc.ut_User.FirstOrDefault(x => x.UserID == dev.UserID).Company;
}