AsyncController 클래스는 비동기 작업 방법을 쓸 수 있습니다. 바인딩 요청을 장기 실행이 아닌 CPU를위한 비동기 작업 방법을 사용할 수 있습니다. 이것은 요청이 처리되는 동안 작업을 수행에서 웹 서버를 차단 방지합니다. AsyncController 클래스에 대한 전형적인 사용은 오래 실행되는 웹 서비스 호출입니다.
이 항목에는 다음 섹션이 포함되어 있습니다
요청을 Thread Pool로 처리하는 방법
Asynchronous 처리 요청
Synchronous 또는 Asynchronous 선택
비동기 작업 방법에서 동기식 동작 방식으로 변환
병렬로 여러 작업 수행
비동기 작업 방법에 속성 추가하기
BeginMethod / EndMethod 작업 패턴
클래스 참조
Download. : 소스 코드와 함께 비주얼 스튜디오 프로젝트는이 주제를 함께 사용할 수 있습니다. Download.
1. 요청을 Thread Pool로 처리하는 방법
웹 서버에서. NET Framework는 ASP.NET 요청을 서비스하는 데 사용되는 스레드의 풀을 유지관리합니다. 요청이 도착하면, 급파되어진 Pool로부터 요청된 스레드를 처리합니다. 요청이 동기적으로 처리되는 동안 스레드가 다른 요청을 서비스를 처리할 수 없는 경우 요청은 차단됩니다.
차단된 많은 스레드를 수용할 정도로 큰 thread pool을 만들 수 있기 때문에 이것은 문제가되지 않을 수도 있습니다. 그러나 thread pool에서 스레드의 수가 제한됩니다. 동시에 여러 장기 실행 요청을 처리하는 큰 어플 리케이션에서는, 사용 가능한 모든 스레드가 차단될 수 있습니다. 이러한 상태는 "스레드 결핍(thread starvation)"으로 알려져 있습니다. 이 조건에 도달하면, 웹 서버의 큐에 요청. 요청 대기열이 가득 차면, 웹 서버가 HTTP 503 상태(서버 너무 바쁨)로 요청을 거부합니다.
2. 비동기 처리 요청 응용 프로그램에서 스레드궁핍 현상이 발생할 수 있으며, 작업을 비동기적으로 처리할 수 있도록 구성할 수 있습니다. 비동기 요청은 동기 요청으로 처리하는 데 시간이 동일한 시간을 소모하지 않습니다. 예를 들어, 네트워크에서 요청을 완료하는것에서 동기적으로 또는 비동기적으로 수행 소모시간은 2초 걸립니다. 그러나, 비동기 호출하는 동안, 서버는 이것이 첫 번째 요청을 기다리는 동안 다른 요청에 응답하지 못하도록 차단하지 않습니다. 따라서, 비동기 요청이 장기 실행 작업 호출에 많은 요청이있을 때 대기 요청을 방지합니다.
비동기 작업이 호출되면, 다음 단계가 발생합니다.
웹 서버가 thread pool (작업자 스레드) 및 들어오는 요청 작업에서 스레드를 가져옵니다. 이 작업자 스레드는 비동기 작업을 시작합니다.
작업자 thread는 요청을 다른 웹 서비스에 대한 thread pool에 반환됩니다.
비동기 작업이 완료되면 ASP.NET은 알려줍니다.
웹 서버가 응답을 렌더링 등 요청의 나머지 부분을 처리하는(비동기 작업을 시작한 스레드에서 다른 스레드일 수 있습니다) 스레드 풀에서 작업자 스레드를 가져옵니다.
다음 그림은 비동기 패턴을 보여줍니다.
3. Synchronours 또는 Asynchronours 동작 방법을 선택 이 섹션은 동기 또는 비동기 동작 방법을 사용하는 경우에 대한 지침을 나열합니다. 이들은 단지 가이드되며 당신이 비동기 작업 방식이 성능에 도움 여부를 확인하는 개별적으로 각 응용 프로그램을 검사해야합니다.
다음 조건에 해당하는 경우 일반적으로 동기식 파이프라인을 사용합니다.
작업 또는 간단한 짧은 - 실행입니다.
단순이 효율보다 중요합니다.
작업은 주로 광범위한 디스크나 네트워크 오버헤드를 포함 작업 대신 주로 CPU의 작업입니다. CPU에 바인딩된 작업에 비동기 작업 방법은 이익이 없고 더 많은 간접비를 지불합니다.
다음 조건에 해당하는 경우 일반적으로, 비동기 파이프라인을 사용합니다.
네트워크 바인딩 또는 CPU 바인딩 대신 I / O 바인딩입니다.
테스트는 사이트 성능 병목 현상이 막히는 것과 IIS는 이러한 차단 요청에 대한 비동기 작업 방법을 사용하여 더 많은 요청을 서비스할 수 있음을 보여줍니다.
병렬은 코드 단순화 보더 더 중요합니다.
사용자가 장기 실행 요청을 취소할 수있는 메커니즘을 제공해야합니다.
다운로드 가능한 샘플은 얼마나 효과적으로 비동기 작업 방법을 사용하여 보여줍니다. 예제 프로그램은 장기 실행 프로세스를 시뮬레이션 수면 메서드를 호출합니다. 몇 가지 생산 응용 프로그램이 비동기 작업 방법을 사용하는 등 분명한 혜택을 보여줍니다.
당신은 비동기 메소드 성능 이점을 제공하는지 확인하려면 응용 프로그램을 테스트해야합니다. 어떤 경우에는 그것은 CPU 당 IIS에서 최대 동시 요청 및 CPU 당 최대 동시 스레드를 높이기 위해 더 좋을 수도 있습니다. ASP.NET 스레드 구성에 대한 자세한 내용은, 토마스ASP.NET Thread Usage on IIS 7.0 and 6.0 에있는 항목을 ASP.NET 스레드 사용을 참조하십시오. , 비동기 데이터베이스 통화를 할 때 표시에 대한 자세한 내용을 보려면 Should my database calls be Asynchronous? 릭 앤더슨의 블로그에 있습니다.
일부 응용 프로그램은 모든 액션 메소드는 비동기해야합니다. 흔히, 작업 량의 최상의 효율을 위해 몇 가지 Asynchronous Method 에서 Synchronous Method로 변환이 필요합니다.
4. 비동기 작업 방법에서 동기식 동작 방식으로 변환
예제 코드는 아래와 포털 컨트롤러에서 뉴스 항목을 표시하는 데 사용되는 동기식 동작 방법을 보여줍니다. 요청 시애틀에 대한 Portal/News?city=Seattle 뉴스 디스플레이.
public class PortalController: Controller { public ActionResult News(string city) { NewsService newsService = new NewsService(); ViewStringModel headlines = newsService.GetHeadlines(city); return View(headlines); } }
다음 예제는 비동기 방식으로 재작 뉴스 동작 방식을 보여줍니다.
public class PortalController : AsyncController { public void NewsAsync(string city) {
public ActionResult NewsCompleted(string[] headlines) { return View("News", new ViewStringModel { NewsHeadlines = headlines }); } }
비동기 작업 방법에 동기 동작 방법을 변환하려면 다음 단계를 포함:
컨트롤러로부터 Controller를 도출하는 대신 AsyncController에서 도출합니다. 그들은 여전히 동기 액션 메서드 방식을 서비스할 수 있고, ASP.NET에서 비동기 요청작업이 가능한 것으로부터 도출된 컨트롤러입니다.
동작에 대한 작성 방법은 두 가지. 비동기 절차를 시작하는 방법은 작업 및 접미사 "비동기"의 구성 이름이 있어야합니다. 비동기 작업이 완료 (the callback method) 작업 및 접미사 "completed"로 구성되어 이름이 있어야합니다. 이전 예제에서, 뉴스 메서드가 두 가지 방법으로 바뀌고있습니다. NewsAsync and NewsCompleted NewsAsync 메서드가 반환하는 void (Visual Basic의 값 없음). NewsCompleted 방법은 ActionResult 인스턴스를 반환합니다. 동작이 두 가지 방법으로 구성되어 있지만, 그것이 동기 동작 방법에 대해서는 (예를 들어, Portal/News?city=Seattle )와 같은 URL을 사용하여 액세스할 수 있습니다. RedirectToAction및 RenderAction 같은 방법도 뉴스가 아닌 NewsAsync 같은 작업 방법을 참조합니다.
NewsAsync에 전달되는 매개 변수는 일반적인 매개 변수 바인딩 메커니즘을 사용합니다. 전달된 매개변수는 Parameters 사전을 이용한 NewsCompleted일 수 있습니다.
교체 비동기 작업 메서드에서 비동기 호출로 원래 ActionResult 방식의 동기식 호출합니다. 위의 예에서, newsService.GetHeadlines에 대한 호출이 newsService.GetHeadlinesAsync에 대한 호출로 대체됩니다.
NewsAsync에 전달되는 매개 변수는 일반적인 매개 변수 바인딩 메커니즘을 사용합니다. 전달되는 매개 변수는 매개 변수를 사용하여 사전 NewsCompleted 수 있습니다.
교체 비동기 작업 메서드에서 비동기 호출로 원래ActionResult방식의 동기식 호출합니다. 위의 예에서, newsService.GetHeadlines에 대한 호출이 newsService.GetHeadlinesAsync에 대한 호출로 대체됩니다.
OutstandingOperations 속성은 많은 작업이 보류중인 방법에 대해 ASP.NET에 알려줍니다. ASP.NET은 많은 작업이 작업 방법에 의해 시작되었습니다 방식이나 때 이러한 작업이 완료 확인을 할 수 없기 때문에 이것이 필요합니다. OutstandingOperations 속성이 0 인 경우, ASP.NET은 NewsCompleted 메서드를 호출하여 전반적인 비동기 작업을 완료합니다.
비동기 작업 방법에 대한 참고 :
작업 이름은 샘플을 경우, 프레임 워크는 SampleAsync과 SampleCompleted 방법을 찾을 것입니다.
보기 페이지 Sample.aspx 보다는 SampleAsync.aspx 또는 SampleCompleted.aspx 이름이어야합니다. (작업 이름은 샘플이 아니라 SampleAsync합니다.)
컨트롤러가 SampleAsync라는 비동기 방법 및 샘플라는 동기 메서드를 포함할 수 없습니다. 그렇지 않으면 SampleAsync 작업 방법과 샘플 작업 방식은 동일한 요청 서명을했기 때문에, AmbiguousMatchException 예외가 throw됩니다.
5. 병렬로 여러 작업 수행 비동기 작업 방법은 작업을 여러 개의 독립적인 작업을 수행해야 할 때 유용합니다. 예를 들어, 포털 사이트뿐만 아니라 뉴스지만, 스포츠, 날씨, 주식 및 기타 정보를 표시 수도 있습니다.
다음 예제는 뉴스 포털 색인 작업 방법의 동기 버전을 보여줍니다.
public ActionResult IndexSynchronous( string city ) {
NewsService newsService = new NewsService(); string[] headlines = newsService.GetHeadlines();
SportsService sportsService = new SportsService(); string[] scores = sportsService.GetScores();
WeatherService weatherService = new WeatherService(); string[] forecast = weatherService.GetForecast();
호출되는 각 서비스는 순차적으로 만들어집니다. 따라서, 요청에 응답하기 위해서 필요한 시간은 각 서비스 호출 + 오버헤드의 작은 량의 합계입니다. 예를 들어, 호출 작업, 400, 500,그리고 600 밀리초 걸릴 경우, 전체 응답 시간이 약간 더 1.5 초 이상의 것입니다. 그러나, 서비스 호출 (병렬) 비동기적으로 이루어질 경우 전체 응답 시간이 있기 때문에 가장 긴 작업의 기간입니다, 대략 600 밀리초 일 것입니다.
다음 예제는 뉴스 포털 색인 액션 메서드의 비동기 버전을 보여줍니다.
public void IndexAsync(string city) { AsyncManager.OutstandingOperations.Increment(3);
비동기 작업 방법은 BeginMethod / EndMethod 패턴을 사용하여 메소드를 제공하는 서비스를 호출하면 콜백 메서드는 (즉, 시작 메서드에 비동기 콜백 매개 변수로 전달되는 방법입니다) ASP.NET Controller 아래에 있지 않은 스레드에서 실행할 수도 있습니다. 그렇다면, HttpContext.Current은 null이 될것입니다. 이것은 같은 Parameters와 같은AsyncManager class 변수 멤버에 액세스하는 경우, 응용 프로그램에서 경쟁 조건이 발생할 수 있습니다. 그리고 경쟁 조건을 피하고 HttpContext.Current 인스턴스에 액세스하기 위해서 콜백 메서드에서 calling Sync() 를 호출하여 HttpContext.Current 복원할 수 있습니다.
콜백은 동기적으로 완료하면, 콜백 및 ASP.NET의 통제하에있는 작업이 동시성 문제가 없이 연속적으로 작동됩니다. 스레드에서 실행됩니다. 스레드에서 Sync()를 호출은 이미 ASP.NET의 통제하에 정의되지 않은 동작을하고 있습니다.
ActionCompleted 방법은 항상 ASP.NET의 통제하에있는 스레드에서 호출됩니다. 따라서, 그 방법에서 fSync()를 호출하지 않습니다.
시작 메서드에 전달하는 콜백이 ASP.NET의 통제하에있는 스레드를 사용하여 호출할 수 있습니다.따라서 Sync()를 호출하기 전에 이 조건을 확인합니다. 작업 (CompletedSynchronously 사실이라면, 그것이) 동기적으로 완료하면, 콜백은 원래의 스레드에서 실행되며이 Sync()를 호출하지 않아도됩니다. 작업 ( CompletedSynchronously거짓이다는 것을) 비동기 완료하면, 콜백은 thread pool 또는 I / O를 완료 포트 스레드에서 실행되며이 Sync()를 호출해야합니다.