实体框架SaveChanges异步

时间:2014-11-12 03:19:29

标签: 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 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
}

1 个答案:

答案 0 :(得分:0)

在使用Async Await的场景中,如果您的后台进程比父进程的生命周期更长,您可能会面临类似于您所面临的情况。

如果您正在运行框架4.5.2或者如果您可以升级到该框架,那么您的方案中的最佳选择是使用QueueBackgroundWorkItem API。下面是使用链接

http://codingcanvas.com/using-hostingenvironment-queuebackgroundworkitem-to-run-background-tasks-in-asp-net/

http://blogs.msdn.com/b/webdev/archive/2014/06/04/queuebackgroundworkitem-to-reliably-schedule-and-run-long-background-process-in-asp-net.aspx

如果您使用的是框架4.5,则可以按照本文中的建议使用IRegisteredObject实现

http://haacked.com/archive/2011/10/16/the-dangers-of-implementing-recurring-background-tasks-in-asp-net.aspx/