2012-05-19 17 views

回答

30

Task.Factory.Start將啓動一個新的Thread而且由於HttpContext.Context是本地的也不會被全自動複製到新Thread一個線程,所以你需要手工傳遞:

var task = Task.Factory.StartNew(
    state => 
     { 
      var context = (HttpContext) state; 
      //use context 
     }, 
    HttpContext.Current); 
+0

有趣的是,這對我來說確實很奇怪。例如,HttpContext的User屬性在進入線程後變爲null,儘管它在HttpContext.Current中有值。 – Giedrius

+2

是的,值得注意的是,使用對HttpContext.Current的引用可能會工作很長時間,但不建議使用,並且有時可能會失敗。當http請求完成時,ASP運行時可能會清理對象,然後您會發現諸如'context.Items [x]'之類的內容不包含您之前放置的內容。另請參見http://stackoverflow.com/questions/8925227/access-httpcontext-current-from-threads – Rory

8

你可以使用閉包把它使用新創建的線程上:

var currentContext = HttpContext.Current; 

Task.Factory.Start(() => { 
    // currentContext is not null here 
}); 

但請記住,一個任務可以活得比的HTTP請求的生命週期和訪問HTT時,可能會導致有趣的結果請求完成後的PContext。

+0

我喜歡用這種方式,而不是傳入狀態對象並將項目轉換爲單個變量......凌亂。 –

0

由於David指出,HttpContext.Current不會一直工作。在我的情況下,大約20次中有1次,CurrentContext將爲空。結束於下面。

string UserName = Context.User.Identity.Name; 

System.Threading.Tasks.Task.Factory.StartNew(() => 
{ 
    UserName ... 
} 
相關問題