我正在寻找添加一些后台处理到我的ASP.NET MVC 5应用程序,更具体地执行HostingEnvironment.QueueBackgroundWorkItem的一些长期(5-10秒)运行任务。现在,我遇到的问题是代码运行“带外”,并且不再与请求绑定 - Autofac处理一些注入的依赖关系。Autofac和HostingEnvironment.QueueBackgroundWorkItem
下面是一些代码:
[HttpPost, ActionName("Execute")]
public ActionResult ExecutePost(Guid taskguid, FormCollection values)
{
if (taskguid == default(Guid))
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
var model = _taskListService.GetTaskByGuid(taskguid);
if (TryUpdateModel(model.TaskObject as MissingCrossReferenceTask))
{
model.TaskObject.DependencyContainer = _dependencyContainer;
model.TaskObject.TaskListId = model.Id;
HostingEnvironment.QueueBackgroundWorkItem(ct => ExecuteTask(ct, model));
return RedirectToAction("Index", "Dashboard");
}
return View(model);
}
在上述DependencyContainer的代码是包含多个依赖性由Autofac注射(EF库和服务)
private void ExecuteTask(CancellationToken ct, TaskList model)
{
model.TaskObject.Execute();
}
对象MissingCrossReferenceTask执行方法的内部(它与ASP.NET MVC项目分开组装):
public bool Execute()
{
long tableId = DependencyContainer.CrossReferenceService.GetCrossReferenceTable(TableName).Id;
string currentValue = DependencyContainer.CrossReferenceService.GetValue(FromValue, tableId);
...
}
第一行抛出一个异常:ObjectDisposedExcetion {“的ObjectContext的实例已经设置,不能再用于需要连接的操作”}
现在,我不知道Autofac不够好找出解决这个问题的最佳方法。是否有可能在ExecuteTask方法中直接重新引用引用?如果是这样 - 如何?
我非常感谢任何帮助。它已被我逼疯了,现在几天...
感谢, 尼克Goloborodko