C# Asp.net MVC调用新请求
我有一个控制器动作,它为长时间运行的进程创建一个新线程 控制器通过C# Asp.net MVC调用新请求,c#,asp.net,asp.net-mvc,ninject,C#,Asp.net,Asp.net Mvc,Ninject,我有一个控制器动作,它为长时间运行的进程创建一个新线程 控制器通过Ninject获取其依赖项 问题是,当线程试图访问依赖项时,该依赖项已经被释放 是否有一种方法可以从创建的线程内部发出一个全新的请求,该线程将执行长时间运行的任务,从而重新创建依赖项 public class HomeController : Controller { private readonly IUnitOfWork _unitOfWork; public HomeController( I
Ninject
获取其依赖项
问题是,当线程试图访问依赖项时,该依赖项已经被释放
是否有一种方法可以从创建的线程内部发出一个全新的请求,该线程将执行长时间运行的任务,从而重新创建依赖项
public class HomeController : Controller
{
private readonly IUnitOfWork _unitOfWork;
public HomeController(
IUnitOfWork unitOfWork)
{
_unitOfWork = unitOfWork;
}
[HttpPost]
public ActionResult DoLongRunningTask(Guid product_Id)
{
// long running action
ThreadPool.QueueUserWorkItem(
(data) =>
{
try
{
// _unitOfWork is already disposed when i get here
Product product = _unitOfWork.Products.First(p => p.Id == product_Id);
// do long running task
}
catch (Exception ex)
{
}
});
return new JsonNetResult { Data = new { } };
}
}
当它为空时重新创建它怎么样。使用DependencyResolver.Current.GetService
try
{
if(_unitOfWork==null)
{
_unitOfWork=(IUnitOfWork)DependencyResolver.Current.GetService(typeof(IUnitOfWork));
}
Product product = _unitOfWork.Products.First(p => p.Id == product_Id);
// do long running task
}
注意:不确定是否将DependencyResolver。当前的此时存在将IResolutionRoot
注入控制器,然后将IResolutionRoot
从控制器传递到任务,然后在新线程内,使用IResolutionRoot
检索所有依赖项。但是,如果依赖项绑定在RequestScope中,则会遇到一个问题:新线程中没有请求范围。您可能会伪造它(it=request),或者您可能需要调整绑定。至少它会立即显示是否存在范围界定问题。