문제

나는 별도의 스레드에서 비동기 작업을하고 있습니다.

ThreadPool.QueueUserWorkItem()

그리고이 별도의 스레드에서는 HttpContext.Current 액세스 할 수 있도록 :

HttpContext.Current.Cache  
HttpContext.Current.Server  
HttpContext.Current.Request  

하지만, HttpContext.Current 이 별도의 스레드를 만들 때 null입니다.

의문

새 스레드를 어떻게 만들 수 있습니까? HttpContext.Current NULL이 아닌가? 아니면 캐시, 서버 및 요청 객체에 액세스 할 수있는 다른 방법이 있습니까?

도움이 되었습니까?

해결책

HTTPContext와 같은 ASP.NET 스택에 의존하는 객체에 대한 참조를 사용하지 않으려 고 노력합니다. 다른 스레드에서 작업을 수행 해야하는 경우 작업이 완료 될 때까지 ASP.NET에서 기다리고 싶지 않기 때문입니다. 그리고 스레드가 아닌 동안 요청/컨텍스트/세션이 종료 될 수 있습니다.

스레드에 필요한 데이터가있는 객체를 전달해야합니다.

다른 팁

ASP.NET 캐시에 액세스 할 수 있습니다 httpruntime.cache HTTPContext가 없지만 불행히도 서버 나 요청에 액세스 할 수 없습니다.

당신이 그것에 대해 생각한다면, 이것은 의미가 있습니다 - 당신은 어떤 페이지에도 서비스를 제공하지 않으므로 요청이 없습니다.

1- 하단 코드를 추가하십시오 <system.serviceModel> web.config 파일에서 :

<serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> 

2- 웹 서비스 파일에서 네임 스페이스 후 하단 코드 추가 :

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]

3- 웹 파트 프로젝트 재건. 완료!

참조

httpcontext.server 서비스의 경우 httpserverutility 클래스를 사용할 수 있습니다. 캐시의 경우 위에서 언급 한 것처럼 httpruntime.cache를 사용할 수 있습니다. 요청 객체의 경우 요청에서 스레드로 데이터를 전달할 수 있습니다. request.querystring 또는 request.form ... 또는 무엇이든 같은 것들.

스레드 풀 구현이 있습니다 여기 이는 호출 스레드의 HTTP 컨텍스트의 전파를 제공합니다. 나는 아직 그것을 사용하지 않았지만 계획을 세우고 있습니다.

별도의 스레드가 해당 객체에 액세스하려고한다면 그렇습니다. 그 객체는 스레드 레벨에서 스코핑됩니다. 새 스레드에서 사용하려면 필요한 방법/클래스로 전달해야합니다.

일반적으로 ASP.NET은 새 스레드를 생성 할 수 없습니다 ... 여기에 게시하다 주제에.

여기에 좋은 글이 있습니다 MSDN에서 ASP.NET의 스레딩.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top