2012-05-19 2 views

답변

30

Task.Factory.Start 새로운 Thread을 해고하고 손으로 전달해야하므로 HttpContext.Context 때문에,이를 automaticly 새로운 Thread에 복사되지 않습니다 스레드에 로컬됩니다

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

흥미롭게도 저에게는 이상합니다. 예를 들어, HttpContext의 사용자 속성은 HttpContext.Current에 값을 가지고 있지만 스레드를 입력 한 후 null이됩니다. – Giedrius

+2

예, HttpContext.Current에 대한 참조를 사용하면 시간이 많이 걸릴 수는 있지만 권장하지 않으며 때때로 실패 할 가능성이 있습니다. ASP 런타임은 http 요청이 완료되면 객체를 정리할 수 있습니다. 그런 다음'context.Items [x]'에 이전에 넣은 것을 포함하지 않습니다. 또한 http://stackoverflow.com/questions/8925227/access-httpcontext-current-from-threads – Rory

8

당신은 수를 작업은 HTTP 요청의 수명을 오래 살 수 있고, HTT에 액세스 할 때 재미있는 결과가 발생할 수

var currentContext = HttpContext.Current; 

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

하지만 명심 : 새로 만든 스레드에 사용할 가지고 클로저를 사용 요청이 완료된 후 PContext.

+0

을 참조하십시오. 상태 객체를 전달하고 개별 변수로 항목을 캐스팅하는 대신이 방법을 사용하는 것이 좋습니다. 지저분합니다. –

0

David으로 지적했듯이 HttpContext.Current는 항상 작동하지 않습니다. 내 경우에는 약 20 시간 중 하나, CurrentContext null이됩니다. 아래로 끝내십시오.

string UserName = Context.User.Identity.Name; 

System.Threading.Tasks.Task.Factory.StartNew(() => 
{ 
    UserName ... 
} 
관련 문제