【问题标题】:Entity Framework 6: async, sync and transactions实体框架 6:异步、同步和事务
【发布时间】:2015-04-14 23:57:54
【问题描述】:

我正在使用 ASP.NET MVC 和 EF 6,并且我有一个控制器,它调用我的服务层来执行一些操作。其中一项操作必须是异步的,以便控制器可以在该操作完成之前返回视图。看起来是这样的:

  1. 正在执行控制器操作。
  2. 调用服务。
  3. 服务执行一些将数据保存在数据库中的操作。
  4. Services 启动一个新任务并将控制权返回给 Controller。

    (Task.Factory.StartNew(() => X())

  5. 控制器调用另一个跟踪用户操作的服务。这个 是它失败的地方,因为我在 (4) 上开始的异步操作使用事务并且它们共享相同的 DbContext。

我应该如何处理?

编辑:

我得到一个异常,因为 DbContext 已被释放(控制器在执行 Action 后正在释放 DbContext。

我通过使用新的 DbContext 创建新服务来解决此问题,但这不是最佳解决方案。因此,我异步调用了一个方法,并在该方法中创建了一个由 using 语句包围的新 DbContext,以便在执行异步方法后将其释放。

【问题讨论】:

  • 请发布您到目前为止所尝试的内容,简短而完整的问题重现会有所帮助。请解释一下这是失败的地方实际上是什么意思,例外?
  • 我添加了额外的信息。

标签: asp.net-mvc entity-framework asynchronous async-await dbcontext


【解决方案1】:

您可以为步骤4 创建一个单独的ActionResult,并使用HttpClient 调用该操作。

这样它将重新创建DbContext(就像一个新请求一样)。

1..
2..
3..
4
Task.Factory.StartNew(async () =>
{
    var url = "/Home/SecretAction";

    using (HttpClient client = new HttpClient())
    {
        client.PostAsync(url, new StringContent(""));
    }
});
5..

【讨论】:

  • 如果控制器是异步方法的所有者,这将起作用。如前所述,服务有一个异步操作,而不是控制器。由于显而易见的原因,我无法从服务中调用控制器操作。感谢您的回答,但这并不是我想要的。
  • 那么,2, 3 and 4 都是async 服务的一部分吗?控制器本身负责5?如果是,你不能把2, 3 and 4 放在SecretAction 中吗?因为控制器本身不需要回复。如果不是,我的错,我没有完全理解这个场景
  • 2 和 3 是同步的。当 2 和 3 完成时,4 异步启动。
猜你喜欢
  • 2020-05-16
  • 2012-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多