5

백그라운드에서 실행하고 싶은 프로세스가 있습니다. 이 작업 링크를 클릭하면 실행됩니다.

수행 할 조치 :

   public async Task<ActionResult> ProcessRec()
   {
        await Task.Run(() => waitTimer());
        return RedirectToAction("Index", "Home");
   }

   public void waitTimer()
   {
        Thread.Sleep(10000);
   }

그러나 이것은 "Index, Home"액션으로 리디렉션되기 전에 10 초 동안 기다립니다. 나는 아주 새로운 Await / Async 그래서 나는 여기서 뭔가 잘못 해석하고 있음을 알고 있습니다. waitTimer가 백그라운드에서 실행되는 동안 응용 프로그램이이 동작으로 돌아 가게하려면 어떻게합니까? 감사!!


3 답변


4

await사용자가 알았 으면 응답이 완료되기 전에 응답을 차단합니다. 일반적으로 백그라운드 작업을 다른 스레드에 넣고 기다리지 않고 "실행 및 저장"하도록 설정할 수 있지만 ASP.NET에서는 IIS가 사용되지 않는 AppDomains를 종료하고Task.RunIIS에 백그라운드 스레드가 "AppDomain을 사용 중임"을 알리지 않기 때문에 백그라운드 스레드가Thread.Abort()AppDomain 종료 중.

.NET 4.5.2 이상을 사용하는 경우 IIS를 통해 백그라운드 작업자를 통해 알 수 있습니다.QueueBackgroundWorkItem. 너는 이렇게 쓸거야.

   public ActionResult ProcessRec()
   {
        HostingEnvironment.QueueBackgroundWorkItem(waitTimer);
        return RedirectToAction("Index", "Home");
   }

   public void waitTimer(CancellationToken token)
   {
        Thread.Sleep(10000);
   }
   //You also could do
   public async Task waitTimer2(CancellationToken token)
   {
        await Task.Delay(10000);
   }

이제는 IIS가 앱 도메인을 종료시키지 않는다고 보장하지는 않지만 사용자가 무언가의 한가운데 있다는 것을 알려주고 시스템을 종료하려고 할 때 더 많은 시간을 요청합니다 ( 대기열에있는 모든 백그라운드 항목을 기본적으로 완료하기 위해 종료가 시작됩니다.

자세한 내용은이 MSDN 블로그그것을 소개합니다.


  • 4.5의 HostingEnvironment.QueueBackgroundWorkItem 없음 - rnofenko
  • 그는 .NET 4.5.2를 말했다. - John Saunders
  • 4.5.2로 업데이트되었으며 위의 내용은 내 요구 사항에 완벽하게 적용됩니다! 매우 감사! - Norman Bentley

2

그러나 이것은 "Index, Home"액션으로 리디렉션되기 전에 10 초 동안 기다립니다.

그렇습니다.await작업 완료를 비동기 적으로 기다립니다. 작업이 완료 될 때까지 스레드를 풀로 반환합니다.

waitTimer가 백그라운드에서 실행되는 동안 응용 프로그램이이 동작으로 돌아 가게하려면 어떻게합니까?

Task.Run은 IIS에서 작업을 등록하지 않는다는 점에서 위험합니다.이는 문제를 일으킬 수있다.. 대신, 다음을 사용할 수 있습니다.BackgroundTaskManager또는꽉 화재ASP.NET에서 실행을 등록합니다.

BackgroundTaskManager.Run(() => { waitTimer() };
return RedirectToAction("Index", "Home");


  • 링크 된 라이브러리 두 개는 4.5.2로 업그레이드 할 수없는 경우 매우 유용한 대안입니다.QueueBackgroundWorkItem. - Scott Chamberlain
  • @ 스캇 그래, 나는 그가 말한 것을 보았다. NET 4.5 :) - Yuval Itzchakov

1

대기열 (예 : 저축 저장 장치 / 서비스 버스 대기열)에 메시지를 보내면 즉시 응답을받을 수 있습니다.

그런 다음 메시지를 큐에서 제거하고 처리하는 다른 서비스를 작성하십시오 (장기 실행 태스크 실행).

또한 이것이 푸른 웹 사이트 (웹 응용 프로그램) 인 경우 웹 작업을 사용할 수 있습니다!

희망이 도움이됩니다.

연결된 질문


관련된 질문

최근 질문