Asp.net mvc 3 任务/线程的对象范围问题

Asp.net mvc 3 任务/线程的对象范围问题,asp.net-mvc-3,entity-framework-4,ninject,task-parallel-library,unit-of-work,Asp.net Mvc 3,Entity Framework 4,Ninject,Task Parallel Library,Unit Of Work,我有一个MVC3项目,它使用Ninject、实体框架和带有服务层的工作单元模式 我的AsyncService类有一个函数,用于启动后台任务,例如,将用户添加到用户存储库。 我当前的问题是,在我得到DbContext已被释放的错误之前,任务只正确运行了几秒钟。 我的数据库上下文(注入了Ninject的InRequestScope()后)似乎被丢弃了,因为InRequestScope()将其与HttpContext绑定 我已经读过InThreadScope(),但是我不知道如何在我的MVC项目中正确

我有一个MVC3项目,它使用Ninject、实体框架和带有服务层的工作单元模式

我的AsyncService类有一个函数,用于启动后台任务,例如,将用户添加到用户存储库。 我当前的问题是,在我得到DbContext已被释放的错误之前,任务只正确运行了几秒钟。 我的数据库上下文(注入了Ninject的InRequestScope()后)似乎被丢弃了,因为InRequestScope()将其与HttpContext绑定

我已经读过InThreadScope(),但是我不知道如何在我的MVC项目中正确地实现它

我的问题是:在我的任务中使用Ninject的正确方法是什么

public class AsyncService
{
    private CancellationTokenSource cancellationTokenSource;
    private IUnitOfWork _uow;
    public AsyncService(IUnitOfWork uow)
    {
        _uow = uow;
    }
    public void AsyncStartActivity(Activity activity)
    {
    ...snip...
        this.cancellationTokenSource = new CancellationTokenSource();
        var cancellationToken = this.cancellationTokenSource.Token;
        var task = Task.Factory.StartNew(() =>
            {
                foreach (var user in activity.UserList)
                {
                    this._uow.UserRepository.Add(new User() {UserID = user});
                }
                this._uow.Save();
            }, cancellationToken);
     ...snip...
    }
}

InRequestScope
'd对象在请求结束时是
Dispose
d,因此在这种情况下不能使用
InThreadScope
也不适合,因为这样会将UoW重新用于多个任务

不过,您可以使用NamedScope扩展将您的
AsyncService
声明为内所有对象的作用域对象


请参见

这是一个混乱的解决方案,我以前使用过ChildKernel插件(我认为命名范围会更干净)。基本上,我创建了一个子内核,并将与UoW相关的所有内容都作为子内核中的单例来定义范围。然后,我为每个任务创建一个新的子内核,处理UoW,并提交或回滚

IAsyncTask
是一个带有1个方法的接口,
Execute()

private Task void ExecuteTask(),其中T:IAsyncTask
{
var task=task.Factory.StartNew(()=>
{
var taskKernel=_kernel.Get();
var uow=taskKernel.Get();
var asyncTask=taskKernel.Get();
尝试
{
uow.Begin();
asyncTask.Execute();
提交();
}
捕获(例外情况除外)
{
uow.Rollback();
//记录下来,不管你想做什么
}
最后
{
uow.Dispose();
taskKernel.Dispose();
}
});
返回任务;
}

是否有示例代码?杰森,你在哪里能让它工作?我也遇到了同样的问题,但是下面的链接没有帮助。我也遇到了同样的问题,我想看看这个场景的一些示例代码。
private Task void ExecuteTask<T>() where T:IAsyncTask
{

        var task = Task.Factory.StartNew(() =>
                                             {
            var taskKernel = _kernel.Get<ChildKernel>();
            var uow = taskKernel.Get<IUnitOfWork>();
            var asyncTask = taskKernel.Get<T>();

            try
            {
                uow.Begin();
                asyncTask.Execute();
                uow.Commit();
            }
            catch (Exception ex)
            {
                uow.Rollback();
                //log it, whatever else you want to do
            }
            finally
            {
                uow.Dispose();
                taskKernel.Dispose();
            }
      });
      return task;
}