동시성이 높은 서버 측 프로그래밍에서 성능 병목 현상이 발생하면 동기화로 인해 발생하는 경우가 많습니다. HTTP 요청을 수신할 때 비동기가 필요합니다.
HTTP 요청을 비동기적으로 수신하기 위한 기본 클래스:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Web; namespace MyHandler { public abstract class HttpAsyncHandler : IHttpAsyncHandler, IAsyncResult { public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData) { _callback = cb; _context = context; _completed = false; _state = this; ThreadPool.QueueUserWorkItem(new WaitCallback(DoProcess), this); return this; } public void EndProcessRequest(IAsyncResult result) { } public bool IsReusable { get { return false; } } public abstract void BeginProcess(HttpContext context); public void EndProcess() { //防止多次进行多次EndProcess if (!_completed) { try { _completed = true; if (_callback != null) { _callback(this); } } catch (Exception) { } } } private static void DoProcess(object state) { HttpAsyncHandler handler = (HttpAsyncHandler)state; handler.BeginProcess(handler._context); } public void ProcessRequest(HttpContext context) { throw new NotImplementedException(); } private bool _completed; private Object _state; private AsyncCallback _callback; private HttpContext _context; public object AsyncState { get { return _state; } } public WaitHandle AsyncWaitHandle { get { throw new NotImplementedException(); } } public bool CompletedSynchronously { get { return false; } } public bool IsCompleted { get { return _completed; } } } }
TestHandler.cs 추가:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; namespace MyHandler { public class TestHandler : HttpAsyncHandler { public override void BeginProcess(System.Web.HttpContext context) { try { StreamReader sr = new StreamReader(context.Request.InputStream); string reqStr = sr.ReadToEnd(); context.Response.Write("get your input : " + reqStr + " at " + DateTime.Now.ToString()); } catch (Exception ex) { context.Response.Write("exception eccurs ex info : " + ex.Message); } finally { EndProcess();////最后别忘了end } } } }
MyHandler.dll을 사이트에 도입하고 WebConfig를 다음과 같이 수정합니다.
<?xml version="1.0" encoding="utf-8"?> <configuration> <system.web> <compilation debug="true" targetFramework="4.0"/> <pages validateRequest="false" controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID"/> <httpRuntime requestValidationMode="2.0"/> <customErrors mode="Off"/> <httpHandlers> <add verb="*" path="Test.aspx" type="MyHandler.TestHandler, MyHandler"/> </httpHandlers> </system.web> </configuration>
위 내용은 C# HttpHandler 비동기 청취 요청에 대한 자세한 코드 설명입니다. 더 많은 관련 내용은 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!