zoukankan      html  css  js  c++  java
  • Asp.net异步IHttpAsyncHandler示例

    /// <summary>
        /// 异步IHttpHandler,实现了一个简单的统计流量的功能,
        /// 由于是示例代码,所以没有判断IP或者MAC
        /// </summary>
        public class Handler1 : IHttpAsyncHandler
        {
            //默认访问量是0
            static int visitCount = 0;
            /// <summary>
            /// 这个HttpHandler的同步方法
            /// </summary>
    
            /// <param name="context"></param>
            public void ProcessRequest(HttpContext context)
            {
            }
    
            public bool IsReusable
            {
                get
                {
                    return false;
                }
            }
    
            /// <summary>
            /// 实现IHttpAsyncHandler 接口方法
            /// </summary>
            /// <param name="context">当前HttpContext</param>
            /// <param name="cb">回调函数</param>
            /// <param name="extraData"></param>
            /// <returns></returns>
            public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)
            {
                //这里可以加上判断IP或mac的方法
                visitCount++;
                //实例化AsyncUserVisiteCounterResult对象
                AsyncUserVisiteCounterResult result = new AsyncUserVisiteCounterResult(cb, visitCount, context);
                result.Display();
                return result;
            }
    
           /// <summary>
            ///  结束本次IHttpAsyncHandler工作时触发的request方法
           /// </summary>
           /// <param name="result"></param>
            public void EndProcessRequest(IAsyncResult result)
            {
              
            }
        }
    
        /// <summary>
        /// 自定义IAsyncResult 实现我们额外的Display方法
        /// </summary>
        public class AsyncUserVisiteCounterResult : IAsyncResult
        {
            //回调参数
            private object _param;
            //是否异步执行完成
            private bool _asyncIsComplete;
            //回调方法
            private AsyncCallback _callBack;
            //当前上下文
            private HttpContext _context;
    
            public AsyncUserVisiteCounterResult(AsyncCallback callBack, object stateParam, HttpContext context)
            {
                this._callBack = callBack;
                this._param = stateParam;
                _asyncIsComplete = false;
                this._context = context;
            }
    
    
            public object AsyncState
            {
                get { return this._param; }
            }
    
            /// <summary>
            /// 等待句柄用于同步功能,关于等待句柄会在后续章节陈述
    /// </summary>
            public System.Threading.WaitHandle AsyncWaitHandle
            {
                get
                {
                    return null;
                }
            }
    
            /// <summary>
            /// 该属性表示不需要异步任务同步完成
            /// </summary>
            public bool CompletedSynchronously
            {
                get { return false; }
            }
            /// <summary>
            /// 该属性表示异步任务是否已经执行完成
            /// </summary>
            public bool IsCompleted
            {
                get
                {
                    return this._asyncIsComplete;
                }
            }
    
            /// <summary>
            /// 自定义的额外功能,需要注意的是,执行完异步功能后
            /// 要将_asyncIsComplete设置为true表示任务执行完毕而且
            /// 执行回调方法,否则异步工作无法结束页面会卡死
            /// </summary>
            public void Display()
            {
                //这里先不用waitHandle句柄来实现同步
                lock (this)
                {
                    this._context.Response.Write("你是第" + (int)this._param + "位访问者,访问时间:"+DateTime.Now.ToString());
                    this._asyncIsComplete = true;
                    this._callBack(this);
                }
            }
    
    
    
        }

     实例2

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Threading;
    namespace Comet_Handler
    {
        /// <summary>
        /// Handler2 的摘要说明
        /// </summary>
        public class  Handler2 : IHttpAsyncHandler 
        {
      Func<int> f =() =>
            {
                Thread.Sleep(5000);
                int sum = 0;
                for (int i = 1; i <= 100; i++)
                {
                    sum += i;
                }
                return sum;
            };
    
            public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)
            {
                context.Response.ContentType = "text/plain";
                IAsyncResult areault = f.BeginInvoke(cb, context);
                return areault;
            }
    
            public void EndProcessRequest(IAsyncResult result)
            {
                var context = result.AsyncState as HttpContext;
                context.Response.Write(f.EndInvoke(result));
            }
    
            public bool IsReusable
            {
                get { throw new NotImplementedException(); }
            }
    
            public void ProcessRequest(HttpContext context)
            {
                throw new NotImplementedException();
            }
        } 
    }

     实例三

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Threading;
    namespace Comet_Handler
    {
        /// <summary>
        /// Handler2 的摘要说明
        /// </summary>
        public class  Handler2 : IHttpAsyncHandler 
        {
    
    
            public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)
            {
                context.Response.ContentType = "text/plain";
                AsyncOperation areault = new AsyncOperation(context,cb, extraData);
                areault.StartAsyncWork();
                return areault;
            }
    
            public void EndProcessRequest(IAsyncResult result)
            {
               // AsyncOperation res = (AsyncOperation)result;
    
                //var context = result.AsyncState as HttpContext;
                //context.Response.Write(f.EndInvoke(result));
            }
    
            public bool IsReusable
            {
                get { throw new NotImplementedException(); }
            }
    
            public void ProcessRequest(HttpContext context)
            {
                throw new NotImplementedException();
            }
        }
        public class AsyncOperation : IAsyncResult
        {
            HttpContext _context; //保存context的引用 
            AsyncCallback _cb;//保存回调委托的引用 
            object _state;//保存额外的信息 
            bool _iscomplate;//保存异步操作是否完成 
    
    
            /// <summary> 
            /// 构造函数,将AsyncHttpHandler的参数全部传递进来 
            /// </summary> 
            /// <param name="context"></param> 
            /// <param name="cb"></param> //该回调不可被重写,否则将会出现客户端永久等待的状态 
            /// <param name="state"></param> //构造时该值可以传递任意自己需要的数据 
            public AsyncOperation(HttpContext context, AsyncCallback cb, object state)
            {
                _context = context;
                _cb = cb;
                _state = state;
                _iscomplate = false; //表明当前异步操作未完成 
            }
    
            /// <summary> 
            /// 实现获得当前异步处理的状态 
            /// </summary> 
            bool IAsyncResult.IsCompleted
            {
                get
                {
                    return _iscomplate;
                }
            }
    
            /// <summary> 
            /// 返回 false 即可 
            /// </summary> 
            bool IAsyncResult.CompletedSynchronously
            {
                get
                {
                    return false;
                }
            }
    
            /// <summary> 
            /// 将返回额外的信息 
            /// </summary> 
            object IAsyncResult.AsyncState
            {
                get
                {
                    return _state;
                }
            }
    
            /// <summary> 
            /// 为空 
            /// </summary> 
            WaitHandle IAsyncResult.AsyncWaitHandle
            {
                get
                {
                    return null;
                }
            }
            public void send(string str)
            {
                _context.Response.Write(str);
            }
            /// <summary> 
            /// 表明开始异步处理的主函数(方法名可以改,但上面的调用也需要一起改) 
            /// </summary> 
            public void StartAsyncWork()
            {
                ThreadPool.QueueUserWorkItem(new WaitCallback(StartAsyncTask), null);//相信很多玩国.net winform 开发的一定认识 
            }
    
            private void StartAsyncTask(Object workItemState)
            {
                lock (this)
                {
                    Thread.Sleep(5000);
                    int sum = 0;
                    for (int i = 1; i <= 100; i++)
                    {
                        sum += i;
                    }
                    _context.Response.Write(sum.ToString());
    
                    _iscomplate = true;
                    _cb(this);
                }
            }
    
        }
    }
  • 相关阅读:
    es6+最佳入门实践(11)
    es6+最佳入门实践(10)
    es6+最佳入门实践(9)
    es6+最佳入门实践(8)
    es6+最佳入门实践(7)
    cookie、session、sessionid 与jsessionid之间的关系
    百面数据挖掘工程师-题库(1)
    远程桌面最新漏洞CVE-2019-0708 POC利用复现
    jQuery基础
    JavaScript 基础
  • 原文地址:https://www.cnblogs.com/yeye518/p/3351557.html
Copyright © 2011-2022 走看看