네가 알 아야 할 ASP. NET - - - IHttpAsyncHandler 실질
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. 관심 을 구하 고 추천 을 구하 다.
형님, 격려 좀 해 주세요.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.