Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Asp.net MVC调用新请求_C#_Asp.net_Asp.net Mvc_Ninject - Fatal编程技术网

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),或者您可能需要调整绑定。至少它会立即显示是否存在范围界定问题。