Asp.net mvc MVC4/EF5中的数据库上下文和异步函数

Asp.net mvc MVC4/EF5中的数据库上下文和异步函数,asp.net-mvc,entity-framework,asynchronous,dbcontext,lifetime,Asp.net Mvc,Entity Framework,Asynchronous,Dbcontext,Lifetime,我没有找到类似的问题/答案 在我的控制器(MVC4/EF5应用程序)的一些操作中,我有更新数据库的功能,但这些功能不会影响用户输出(选择后更新信息的功能)。我想在异步线程中发送这些函数(在用户获得渲染页面后将完成)。我不想等待线程和渲染页面的完成。 在这种情况下,数据库上下文如何? 我的上下文生存期为“每个请求”,它在应用程序中删除\u EndRequest: protected virtual void Application_EndRequest() { var entityCont

我没有找到类似的问题/答案

在我的控制器(MVC4/EF5应用程序)的一些操作中,我有更新数据库的功能,但这些功能不会影响用户输出(选择后更新信息的功能)。我想在异步线程中发送这些函数(在用户获得渲染页面后将完成)。我不想等待线程和渲染页面的完成。 在这种情况下,数据库上下文如何? 我的上下文生存期为“每个请求”,它在应用程序中删除\u EndRequest:

protected virtual void Application_EndRequest()
{
    var entityContext = HttpContext.Current.Items["_Context"] as DbContext;
    if (entityContext != null)
        entityContext.Dispose();
}
我在线程中使用自己的上下文(使用块进行正确处理)

但如果我想在线程中将实体附加到DbContext,我会在几种情况下得到一个错误“ObjectStateManager中已经存在具有相同键的对象”。这很奇怪,因为我使用AsNoTracking()选项加载,在调用新线程之前,实体状态在主上下文中是“分离”的。 在另一种情况下,当我在线程中再次尝试来自数据库的请求实体并修改它(而不是附加)时,我多次出现错误“对象处于分离状态” 两个上下文实例是否使用一个ObjectStateManager?错误的出现取决于主线程上下文处理的时间。我的意思是在处理主上下文之前或之后,我在线程中使用上下文

在这种情况下,如何使用具有自己上下文的异步线程?
谢谢。

这里有几个问题:

1) 如果您获取属于一个上下文的对象或其导航属性,并尝试在另一个上下文中使用它们,您将看到错误

2) 一旦您的请求完成,IIS就可以自由地回收
AppDomain。
当这种情况在生产中发生时,您的工作线程将被异常中止。这意味着您根本不能依赖工作线程来做任何事情


如果您想推迟一些昂贵的工作,您应该将工作传递给在另一个进程中实现的某种消息队列—很可能是Windows服务。

我找到了答案,所有工作都正常。 . 您可以向Task StartNew()方法传递一个参数,该参数指示您正在启动的任务是“长时间运行的”,它向任务计划程序提供在新线程上启动任务的提示

var task = Task.Factory.StartNew(Stuff, TaskCreationOptions.LongRunning);
谢谢,medkg15

我不知道1)。我用AsNoTracking()编写了渴望加载。实体已从上下文中分离。。。还有导航属性。大约2)-可能是。。。谢谢
var task = Task.Factory.StartNew(Stuff, TaskCreationOptions.LongRunning);