네가 알 아야 할 ASP. NET - - - IHttpAsyncHandler 실질

11075 단어
앞 에 쓰다
IHttpAsyncHandler 하면 말 그대로 '비동기 IHttpHandler' 아니 겠 습 니까?
그러나 내 가 의문 을 제기 했다. "당신 은 정말 그들의 다른 점 을 알 고 있 습 니까? 당신 은 정말 그것 을 사용 할 수 있 습 니까?" 이 럴 때 한 무리의 사람들 을 쓰 러 뜨 릴 것 입 니 다.
다음은 예전 의 스타일 처럼 그것 을 분석 하고 부족 한 점 을 지적 하 겠 습 니 다.
2. IHttpAsyncHandler 에 대한 개술
마이크로소프트 가 내 놓 은 정 의 는 매우 간단 하 다. HTTP 비동기 처리 프로그램의 대상 이 반드시 실현 해 야 할 협정 을 정의 한다.
아래 의 소스 코드 에서 우 리 는 쉽게 알 수 있 듯 이, 그것 은 IHttpHandler 의 인터페이스 규범 을 계승 하 였 으 며, 동시에 두 가지 방법 이 더 많아 졌 다.
BeginProcessRequest EndProcessRequest  .
using System;
namespace System.Web
{
    public interface IHttpAsyncHandler : IHttpHandler
    {
        IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData);
        void EndProcessRequest(IAsyncResult result);
    }
}
using System;
namespace System.Web
{
    public interface IHttpHandler
    {
        bool IsReusable
        {
            get;
        }
        void ProcessRequest(HttpContext context);
    }
}

그러나 문제 가 생 겼 다. 그것 은 어떻게 비동기 효 과 를 거 두 었 을 까?즉, 어떤 비동기 효과 가 있 습 니까?어떻게 이 비동기 효 과 를 실현 합 니까?
 
3. IHttpAsyncHandler 깊이 이해
1) 왜 다른 걸음 을 할 수 있 습 니까?
어떤 사람들 은 IHttpAsyncHandler 라 고 생각 할 수도 있 습 니 다. 당연히 다른 것 이 라 고 생각 할 수도 있 습 니 다. 저 는 아내 에 게 아내 가 있 는 것 이 아 닙 니까?
        그것 이 있 으 면 정말 다른 걸음 을 할 수 있 습 니까?그러나 우 리 는 자신 이 특수 처 리 를 한 것 이 아니 라 사용자 가 그 에 게 특수 대 우 를 한 것 (또는 특수 처리) 을 알 고 있다.
        대담 하 게 추측 하 겠 습 니 다.
나의 근 거 는 다음 과 같다.
         if (applicationInstance is IHttpAsyncHandler)
                {
                    IHttpAsyncHandler httpAsyncHandler = (IHttpAsyncHandler)applicationInstance;
                    httpContext.AsyncAppHandler = httpAsyncHandler;
                    httpAsyncHandler.BeginProcessRequest(httpContext, this._handlerCompletionCallback, httpContext);
                }
                else
                {
                    applicationInstance.ProcessRequest(httpContext);
                    this.FinishRequest(httpContext.WorkerRequest, httpContext, null);
                }

 
그래서: 결국 저 는 무책임 하 게 여러분 에 게 비동기 자체 가 내부 코드 로 이 루어 진 것 이 라 고 말 했 습 니 다. 외부 호출 은 서로 다른 입 구 를 호출 했 을 뿐 입 니 다 (BeginProcessRequest)
즉, 그 는 아무것도 일어나 지 못 하 는 것 이 아니 라 인터페이스 일 뿐 규범 적 인 문제 일 뿐이다.
2) 어떻게 걸음 을 옮 깁 니까?
다 중 스 레 드 를 한 친 구 는 다 중 스 레 드 (비동기) 를 어떻게 실현 하 는 지 알 고 있 을 것 입 니 다. 방법 이 비교적 많 지만 본질 은 하나 입 니 다. 
마이크로소프트 의 정 의 를 내 립 니 다. 실행 할 수 있 도록 방법 을 대기 열 에 배열 하고 이 방법 에 사용 할 데 이 터 를 포함 하 는 대상 을 지정 합 니 다.이 방법 은 스 레 드 탱크 스 레 드 가 사용 가능 해 졌 을 때 실 행 됩 니 다.말 은 간단 하지만 이해 하기 가 쉽 지 않 은 것 같 습 니 다. 제 이 해 는 다음 과 같 습 니 다. 온라인 탱크 내부 에 해 야 할 모든 일 을 저장 하 는 데 사용 되 는 대기 열 이 있 습 니 다.
스 레 드 탱크 는 자신의 동적 스 레 드 (짐꾼 에 해당) 가 있 는데, 그들 은 무 작위 로 대열 의 일 을 완성 했다.
이 방법 에 대한 설명:
callBack
형식: System. Threading
.WaitCallback
WaitCallback, 실행 할 방법 을 표시 합 니 다.
state
유형: System
.Object
방법 에 사용 되 는 데 이 터 를 포함 하 는 대상.
반환 값 종류: System
.Boolean
이 방법 이 줄 을 서 는 데 성공 하면 true 입 니 다.이 작업 항목 을 줄 을 서지 못 하면 NotSupported Exception 이 발생 합 니 다.
 자, 우 리 는 더 이상 말 하지 않 겠 습 니 다. IHttpAsyncHandler 비동기 화 를 어떻게 실현 하 는 지 보 세 요. 아래 의 인 스 턴 스 소스 코드 를 보 세 요.
실례
using System;
using System.Web;
using System.Threading;

namespace Handler_1
{
    
    class HelloWorldAsyncHandler : IHttpAsyncHandler
    {
        public bool IsReusable { get { return false; } }

        public HelloWorldAsyncHandler()
        {
        }
        public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData)
        {
            context.Response.Write("

Begin IsThreadPoolThread is

" + Thread.CurrentThread.IsThreadPoolThread + "\r
"); AsynchOperation asynch = new AsynchOperation(cb, context, extraData); asynch.StartAsyncWork(); return asynch; } public void EndProcessRequest(IAsyncResult result) { } public void ProcessRequest(HttpContext context) { throw new InvalidOperationException(); } } class AsynchOperation : IAsyncResult { private bool _completed; private Object _state; private AsyncCallback _callback; private HttpContext _context; bool IAsyncResult.IsCompleted { get { return _completed; } } WaitHandle IAsyncResult.AsyncWaitHandle { get { return null; } } Object IAsyncResult.AsyncState { get { return _state; } } bool IAsyncResult.CompletedSynchronously { get { return false; } } public AsynchOperation(AsyncCallback callback, HttpContext context, Object state) { _callback = callback; _context = context; _state = state; _completed = false; } public void StartAsyncWork() { ThreadPool.QueueUserWorkItem(new WaitCallback(StartAsyncTask), null); } private void StartAsyncTask(Object workItemState) { Thread.Sleep(3000); _context.Response.Write("

Completion IsThreadPoolThread is

" + Thread.CurrentThread.IsThreadPoolThread + "\r
"); _context.Response.Write("Hello World from Async Handler!"); _completed = true; _callback(this); } } }

 
설명: 이 비동기 handler 를 외부 에서 호출 할 때 브 라 우 저 에 한 번 에 되 돌려 줍 니 다. Write 를 많이 보지 마 세 요.
5. 관심 을 구하 고 추천 을 구하 다.
        형님, 격려 좀 해 주세요.

좋은 웹페이지 즐겨찾기