백그라운드에서 실행하고 싶은 프로세스가 있습니다. 이 작업 링크를 클릭하면 실행됩니다.
수행 할 조치 :
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가 백그라운드에서 실행되는 동안 응용 프로그램이이 동작으로 돌아 가게하려면 어떻게합니까? 감사!!
await
사용자가 알았 으면 응답이 완료되기 전에 응답을 차단합니다. 일반적으로 백그라운드 작업을 다른 스레드에 넣고 기다리지 않고 "실행 및 저장"하도록 설정할 수 있지만 ASP.NET에서는 IIS가 사용되지 않는 AppDomains를 종료하고Task.Run
IIS에 백그라운드 스레드가 "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 블로그그것을 소개합니다.
그러나 이것은 "Index, Home"액션으로 리디렉션되기 전에 10 초 동안 기다립니다.
그렇습니다.await
작업 완료를 비동기 적으로 기다립니다. 작업이 완료 될 때까지 스레드를 풀로 반환합니다.
waitTimer가 백그라운드에서 실행되는 동안 응용 프로그램이이 동작으로 돌아 가게하려면 어떻게합니까?
Task.Run은 IIS에서 작업을 등록하지 않는다는 점에서 위험합니다.이는 문제를 일으킬 수있다.. 대신, 다음을 사용할 수 있습니다.BackgroundTaskManager또는꽉 화재ASP.NET에서 실행을 등록합니다.
BackgroundTaskManager.Run(() => { waitTimer() };
return RedirectToAction("Index", "Home");
QueueBackgroundWorkItem
. - Scott Chamberlain
대기열 (예 : 저축 저장 장치 / 서비스 버스 대기열)에 메시지를 보내면 즉시 응답을받을 수 있습니다.
그런 다음 메시지를 큐에서 제거하고 처리하는 다른 서비스를 작성하십시오 (장기 실행 태스크 실행).
또한 이것이 푸른 웹 사이트 (웹 응용 프로그램) 인 경우 웹 작업을 사용할 수 있습니다!
희망이 도움이됩니다.