一 主程序 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Threading; using System.Diagnostics; namespace Async { /// <summary> /// version 0.4 ikmb@163.com /// 完成了独立用户异步请求等待 /// 下一个版本将asyncResult换为listeners全局泛型,并通过其它事件,如Send来调用CallBack和Completed /// </summary> public class WebIM_ReceiveHandler : IHttpAsyncHandler { HttpContext m_Context = null; WebIM_AsyncResult asyncResult = null; IAsyncResult IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) { m_Context = context; WebIM_AsyncResult asyncResult = new WebIM_AsyncResult(cb, extraData); //一些耗时异步操作 开始 ThreadPool.QueueUserWorkItem(new WaitCallback(LazyMan.DoWork),asyncResult); //一些耗时异步操作 结束 Debug.Print("BeginProcessRequest End."); return asyncResult; } void IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) { //将消息发送到客户端 Debug.Print("EndProcessRequest End."); } void IHttpHandler.ProcessRequest(HttpContext context) { Debug.Print("ProcessRequest End."); } bool IHttpHandler.IsReusable { get { return true; } } } public class WebIM_AsyncResult : IAsyncResult { public AsyncCallback m_AsyncCallback = null; object m_Data = null; bool m_IsCompleted = false; public WebIM_AsyncResult(AsyncCallback callback, Object extraData) { m_Data = extraData; m_AsyncCallback = callback; } public void SetIsCompleted(bool isc) { m_IsCompleted = isc; } //以下是实现接口 Object IAsyncResult.AsyncState { get { return m_Data; } } bool IAsyncResult.IsCompleted { get { return m_IsCompleted; } } bool IAsyncResult.CompletedSynchronously { get { return false; } } WaitHandle IAsyncResult.AsyncWaitHandle { get { return null; } } } public static class LazyMan { public static IList<WebIM_AsyncResult> Listeners = new List<WebIM_AsyncResult>(); public static void DoWork(Object stateInfo) { WebIM_AsyncResult asyncResult = (WebIM_AsyncResult)stateInfo; Thread.Sleep(1000*10); Debug.Print("LazyMan's work is done."); asyncResult.m_AsyncCallback(asyncResult); //下面一句可以不写,不过写比较好 asyncResult.SetIsCompleted(true); } } } 二 配置 在<httpHandlers>中加入 <add path="recevie.aspx" verb="*" type="Async.WebIM_ReceiveHandler"/> 访问recevie.aspx