ASP.NET MVC 응용 프로그램에서 사용되는 다음 코드 예제가 있습니다. 이 코드의 목적은 장기간 실행되는 작업을 대기열에 넣기위한 "화재 및 잊어"요청을 만드는 것입니다. ASP.NET HttpContext.Current Task.Run 내부
public JsonResult SomeAction() {
HttpContext ctx = HttpContext.Current;
Task.Run(() => {
HttpContext.Current = ctx;
//Other long running code here.
});
return Json("{ 'status': 'Work Queued' }");
}
나는이 비동기 코드에 HttpContext.Current를 처리하기위한 좋은 방법이 아니라는 것을 알고 있지만, 현재 우리의 구현은 없습니다 우리가 다른 일을 할 수 있습니다. 이 코드는 위험한 얼마나 이해하고 싶습니다 ...
질문 : Task.Run 안에있는 HttpContext는, 문맥에 완전히 다른 요청을 설정합니다 설정하는 것이 이론적으로 가능합니까?
나는 그렇다고 생각하지만 확실하지 않습니다. 이해 방법 : Request1은 스레드 풀에서 Thread1로 처리되고 Thread1은 절대적으로 다른 요청 (Request2)을 처리하지만 Task.Run 내의 코드는 Request1에서 Request2로 컨텍스트를 설정합니다.
어쩌면 내가 틀렸을 수도 있지만 ASP.NET 내부에 대한 지식이 없어도 제대로 이해할 수 있습니다.
감사합니다.
전체 HttpContext를 전달하는 대신 필요한 HttpContext에서 정보를 가져 오는 것이 더 간단하지 않겠습니까? (나는 이것이 당신의 질문에 대답하지 않는다는 것을 깨닫는다. 그러나 나는 전체 컨텍스트의 필요성에 관해서 궁금하다.) – vcsjones
맞습니다.이 방법은 정확하지만 유감 스럽지만 현재 변경할 수 없습니다. 우리 코드에는 HttpContext.Current에 대한 액세스 권한이 비즈니스 로직 깊숙한 곳에 있으며 현재 변경되지 않은 큰 노력이 있습니다. –
귀하의 질문과 관련이 없습니다 - 웹 컨텍스트에서 오랫동안 실행되는 작업은 좋은 생각이 아닙니다. 서버가 다시 시작될 수 있고 풀에 많은 스레드가 있습니다. 일단 스레드가 부족하면 요청 처리가 중단됩니다. 당신은 HangFire 또는 Quartz와 같은 것을 고려 했습니까? –