2012-02-23 2 views

답변

3

통합 파이프 라인 모드에서 실행 중일 때 정확한 동작은 분명하지 않지만 통합되지 않은 경우에 대해 알 수 있으며 의미는 동일하게 유지되어야합니다.

간단히 대답하면 동기 또는 비동기 여부에 관계없이 각 이벤트 처리기가 연속적으로 시작되고 이전 이벤트가 완료 될 때까지 다음 이벤트 처리기가 시작되지 않습니다.

소스 코드를 통해 추적 할 수 있습니다.

요청이 들어오고 큐에 저장됩니다. 일반적으로 HttpRuntime은 요청을 대기열에서 제외 할 때 메서드를 호출하여 요청에 대해 HttpApplication을 초기화하고 HttpContext을 인수로 전달합니다.

HttpApplication.InitInternal은 비 통합 모드의 경우 새로운 HttpApplication.ApplicationStepManager 클래스를 초기화합니다. 그러면 BuildSteps 메서드가 호출 된 것을 볼 수 있습니다. 그러면 단계를 저장하고 모든 단계를 구성하고 저장하는 ArrayList을 작성합니다. 특히이 단계는 IExecuteStep 인터페이스의 구현입니다. 궁극적으로 모든 단계가 추가되면리스트를 배열에 복사하고 나중에 멤버로 저장하여 완성됩니다. var _execSteps.

단계에 대한 출처는 여러 가지가 있지만 가장 많이 사용되는 것은 HttpApplication.CreateEventExecutionSteps이며 이벤트 유형 (시작 요청, 권한 부여 등) 및 단계 배열에서 해당 이벤트의 단계를 추가합니다. CreateEventExecutionSteps로 드릴하면 AsyncEventsEvents 테이블에서 각각 알고있는 비동기 및 동기화 처리기에 대해 IExecuteStep이 추가 된 것을 볼 수 있습니다. IExecuteStep 인터페이스 자체는 기본적으로 Execute 메소드와 CompletedSynchronously 플래그로 구성됩니다.

이제, 언급 한 것과 같은 Add 메서드 중 하나 인 AddOnEndRequestAsync을 잠시 되돌아보고 보면 AsyncEvents 테이블에 비동기 처리기에 대한 정보를 추가 할 수 있습니다. 그러면 CreateEventExecutionSteps이이 테이블을 살펴보고 추가 된 각 핸들러에 대해 AsyncEventExecutionStep이 생성됩니다.

요청 흐름으로 돌아갑니다. HttpRuntime은 요청에 대해 HttpApplication을 초기화 한 후 BeginProcessRequest 메서드를 호출하며 이는 ResumeSteps입니다.

ResumeSteps은 단계가 사용되는 방식과 대기 전략이 비동기적인 경우에 볼 수있는 중요한 위치입니다. 실행 단계 배열에 _currentStepIndex을 유지하는 것을 볼 수 있습니다. 결국 배열에서 다음 단계를 가져 와서 Execute 메서드를 호출합니다. 단계에서 실행이 CompletedSynchronously으로보고되면 루프가 실행되고 다시 실행됩니다. 그렇지 않으면, 메소드가 완료되어 비동기 심연으로 들어갑니다.

이 비동기 사례에서 어떤 현상이 발생하는지 보려면 비동기 처리기 용으로 만들어진 AsyncEventExecutionStep 구현을 봐야합니다. Execute 구현에서는 시작 핸들러를 시작하고 완료 콜백을 전달하는 것을 볼 수 있습니다. 생성자에서이 콜백이 결국 HttpApplication.ResumeSteps을 다시 호출하는 메서드로 초기화 된 것을 볼 수 있습니다!

그래서 어레이가 오버런되어 요청 처리를 "완료"할 때까지 단계, 동기화 또는 비동기를 계속 실행합니다.

요점은, 추가하는 이벤트 핸들러로 변환되는 단계가 하나씩 실행되고 있는지 여부와 동기화 또는 비동기 여부에 관계없이 현재 단계가 완료 될 때까지 다음 단계가 실행되지 않는다는 것입니다. 귀하의 질문은 이벤트가 이러한 방식으로 하나씩 처리되는지 여부입니다. 그러나 실제로 볼 수 있듯이 각 이벤트 처리기가 이러한 방식으로 처리되므로 각 이벤트 처리기가 HttpContext에 동기화 된 액세스를 얻고 그들이 여전히 파이프 라인의 "올바른 단계"에 있는지 걱정하고 있습니다.

분명히 그 소스 코드에 다른 세부 사항이 있습니다. 그러나 이것은 요지입니다.

관련 문제