C# 实体框架SaveChanges异步

C# 实体框架SaveChanges异步,c#,entity-framework,asynchronous,task,entity-framework-6,C#,Entity Framework,Asynchronous,Task,Entity Framework 6,我目前正在开发审计跟踪功能并使用实体框架 当前代码可以工作,但运行时间较长 public class MyDbContext : DbContext { public int SaveChanges() { // get changes from ChangeTracker.DetectChanges() // generate custom audit trail records return base.SaveChanges(); } } 我在考虑在保

我目前正在开发审计跟踪功能并使用实体框架

当前代码可以工作,但运行时间较长

public class MyDbContext : DbContext {

  public int SaveChanges() {
    // get changes from ChangeTracker.DetectChanges()

    // generate custom audit trail records

    return base.SaveChanges();
  }
}
我在考虑在保存更改后移动审计跟踪构建并异步执行

public int SaveChanges() {
  // get changes from ChangeTracker.DetectChanges()

  int ret = base.SaveChanges();

  // call async function to create audit

  return ret;
}
我尝试过使用async await,但在处理对象时遇到了问题。我不太习惯线程化/异步调用

是否有类似的方法来执行部分返回,其中父进程获得所需的返回以继续其进程,而对象仍处于活动状态/未处理以继续异步任务

public int SaveChanges() {
  // get changes from ChangeTracker.DetectChanges()

  int ret = base.SaveChanges();

  // partial return ret;

  // continue process in generating audit trail
}

在您的场景中,使用Async Await可能无法像在后台进程超过父进程生命周期的情况下那样工作,您可能会面临类似您所面临的情况

如果您正在运行framework 4.5.2,或者如果您可以升级到该版本,那么在您的场景中,最好的选择是使用QueueBackgroundWorkItem API。下面是使用的链接

如果您使用的是Framework4.5,那么可以按照本文的建议使用iRegistereObject实现


哪个物体被处理掉了?你能发布导致这种情况发生的代码吗?嗨,奈德。使用ChangeTracker条目并遍历它们来构建审计跟踪,这会引发错误。var dbValue=dbEntityEntry。GetDatabaseValues@MiloCabs仅给出引发错误的代码行而不提供其余代码没有多大帮助。这只是意味着在尝试访问DbEntityEntry时,上下文已经被释放,我正在使用4.5。该博客建议实施一项经常性的后台工作。我一直在寻找一个实现,该实现希望退出方法调用,但保持对象活动,因为仍然有一个正在运行的异步/后台作业,这正是目的…Asyn await不是适合您的选项。您可以使用IRegisteredObject实现。我在类似场景中多次使用这两种方法。我将看看是否我可以找到要发布的代码示例。IRegisteredObject位于System.Web下。我的dbContext和db模型在另一个项目中。它仍然是相同的实现吗?是的…它在命名空间System.Web.Hosting下…这用于向托管环境注册您的任务,以便即使您的程序不再存在,主机也可以管理您的项目的生存期