2014-02-06 40 views
0

我有一個控制器操作,爲長時間運行的進程創建一個新的線程。Asp.net MVC調用新的請求

控制器通過Ninject得到它的相關性。

問題是,當線程試圖訪問依賴項時,已經處理完了。

有沒有一種方法可以從Thread創建一個全新的請求,它會執​​行長時間運行的任務,所以依賴關係會被重新創建?

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 { } }; 
    } 
} 
+0

進樣'IResolutionRoot'到控制器,再由控制器通過'IResolutionRoot'的任務,然後在新線程內,使用'IResolutionRoot'來檢索所有的依賴關係。但是,如果您的依賴項綁定在RequestScope中,則會出現問題:新線程中沒有請求範圍。你可能會冒充它(它=請求),或者你可能需要調整綁定。至少它會立即顯示是否存在範圍問題。 – BatteryBackupUnit

回答

0

當它爲空時重新創建它呢?使用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 
} 

PS:不知道會DependencyResolver.Current存在當時