2012-06-25 34 views
4

我需要爲長時間運行的任務啓動一個新線程(寫入文檔存儲,觸發重新索引等)。在新線程中使用Ninject

我在一個ASP.Net MVC網站中使用Ninject。基本上,我想從我的Http Request中產生一個新的線程,它實例化它自己的對象,確保新線程中的Http Request沒有使用數據庫連接等。我不知道用什麼來產生線程,或者如何配置Ninject以不從Web請求上下文中重用我的數據庫會話。

下面是我讀過一些關於在Ninject命名範圍問題

的基本序列圖,但我不知道是否以任何方式的關聯。

Ninject Thread Scope

我CommandProcessor的代碼將產生新的線程是:

public class CommandProcessor 
{ 
    private IKernel _serviceLocator; 

    public CommandProc(IKernel serviceLocator) 
    { 
     _serviceLocator = serviceLocator; 
    } 

    public void Process<TCommand>(TCommand command) where T : ICommand 
    { 
     var commandHandlers = _serviceLocator.Get<ICommandHandler<TCommand>>(); 

     foreach (var commandHandler in commandHandlers) 
     { 
      // I want this call to be asynchronous 
      commandHandler.Handle(command); 
     } 
    } 
} 

由於提前,

哈米什。

回答

2

當你產卵新線程,創建Ninject一個新的激活上下文在線程中使用:

 Thread thread = new Thread(new ThreadStart(() => 
      { 
       using (IActivationBlock activation = kernel.BeginBlock()) 
       { 
        var commandHandlers = activation.Get<ICommandHandler<TCommand>>(); 

        foreach (var commandHandler in commandHandlers) 
        { 
         commandHandler.Handle(command); 
        } 
       } 
      })); 
     thread.Start(); 
+0

嗯,這將使DB背景下從網絡請求範圍去不會瞬態呢? – Anders