并行任务代码,使多个数据库访问

本文关键字:数据库 访问 代码 并行任务 | 更新日期: 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);

我应该如何修改我的代码,使两个读取并行?

并行任务代码,使多个数据库访问

您可以等待该行,因为它不是异步方法。您不能真正等待数据库调用,因为它们不是线程安全的。查看这个线程的一个例子,一种方法做到这一点,并更好地解释为什么不。

也可以考虑使用具有异步方法的SqlCommands。

不能同时使用同一个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;
}