ASP.NET MVC ( http://visualstudiomagazine.com/articles/2013/07/23/async-actions-in-aspnet-mvc-4.aspx )의 비동기 컨트롤러 방법에 대한 기사를 작성 중이며 생각합니다. 요점을 놓칠 수 있습니다.
내가 쓴이 방법을 고려하십시오.이 기사의 예와 매우 유사합니다.
[HttpGet]
[AsyncTimeout(8000)]
[HandleError(ExceptionType = typeof(TimeoutException), View = "TimedOut")]
public async Task<ActionResult> Index(CancellationToken cancellationToken)
{
WidgetPageViewModel model = new WidgetPageViewModel()
{
toAdd = new Widget()
};
model.all = await _repo.GetAllAsync(cancellationToken);
return View(model);
}
내가 이해하는 것처럼, 이것은 런타임에 일이 전개되는 방법입니다.
들어오는 HTTP 요청에 대해 ASP.NET 스레드가 작성됩니다.
이 스레드는 (필요한 예비 작업을 수행했을 것입니다) 위의 Index () 메서드를 입력합니다.
실행은 "await"키워드에 도달하고 다른 스레드에서 데이터 수집 프로세스를 시작합니다.
원래 "ASP.NET"스레드는 Task 클래스의 인스턴스를 반환 값으로 사용하여 처리기 메서드를 호출 한 코드로 반환됩니다.
핸들러 메소드를 호출 한 인프라 코드는 실제 ActionResult 객체를 사용해야하는 지점 (예 : 페이지 렌더링)에 도달 할 때까지 원래 "ASP.NET"스레드에서 계속 작동합니다.
그런 다음 호출자는 Task.Result 멤버를 사용하여이 개체에 액세스합니다.이 멤버 (예 : "ASP.NET"스레드)는 위의 3 단계에서 암시 적으로 생성 된 스레드를 기다립니다.
나는 trifling으로 인식하는 두 가지를 제외하고는 await / async가없는 동일한 것과 비교하여 이것이 성취하는 것을 보지 못했습니다.
await에 의해 생성 된 호출자 스레드와 작업자 스레드는 일정 기간 (위의 # 5의 "까지"부분) 동안 병렬로 작동 할 수 있습니다. 제 직감은 시간이 꽤 짧다는 것입니다. 인프라가 컨트롤러 메소드를 호출 할 때 일반적으로 컨트롤러 호출의 실제 ActionResult가 필요하다면 더 많은 것을 수행 할 수 있다고 생각합니다.
장기 실행 비동기 컨트롤러 작업의 시간 초과 및 취소와 관련된 유용한 새 인프라가 있습니다.
비동기 컨트롤러 메서드를 추가하는 목적은 이러한 ASP.NET 작업자 스레드를 해제하여 실제로 HTTP 요청에 응답하는 것입니다. 이 스레드는 유한 한 리소스입니다. 불행히도, 기사에서 제안한 패턴이 실제로 이러한 스레드를 보존하는 방법을 알지 못합니다. 그리고 그렇게하고 어떻게 든 비 ASP.NET 스레드로 요청을 처리하는 부담을 덜어 주더라도 어떻게하면됩니까? 일반적으로 스레드와는 다른 HTTP 요청을 처리 할 수있는 스레드가 있습니까?
Execution will reach the "await" keyword and kick off a data acquisition process on another thread
-반드시 그런 것은 아닙니다.async
다른 스레드가 필요하지 않습니다 ... 계속입니다. 동일한 스레드에서