zoukankan      html  css  js  c++  java
  • 异步一般处理程序的用法

    一、新建空的WEB项目最好是.net4.5。

      

    二、新建一个一般处理程序,修改IHttpHandler为HttpTaskAsyncHandler,然后敲入如下代码,开始执行。

       

     /// <summary>
        /// AsyncHandler 的摘要说明
        /// </summary>
        public class AsyncHandler : HttpTaskAsyncHandler
        {
            public async override Task ProcessRequestAsync(HttpContext context)
            {
                System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
                sw.Reset();
                sw.Restart();
                context.Response.Write(DateTime.Now.ToString("
    HH:mm:ss") + "    开始异步ProcessRequestAsync");
                context.Response.Write(DateTime.Now.ToString("
    HH:mm:ss") + "    创建异步执行代码任务,并设置任务耗时10000。");
                var task = ExecuteTask(context, 10000);
                context.Response.Write(DateTime.Now.ToString("
    HH:mm:ss") + "    创建异步执行代码任务,并设置任务耗时20000。");
                var task2 = ExecuteTask(context, 20000);
                context.Response.Write(DateTime.Now.ToString("
    HH:mm:ss") + "    继续执行代码,并等待3秒。");
                System.Threading.Thread.Sleep(3000);
                context.Response.Write(DateTime.Now.ToString("
    HH:mm:ss") + "    开始等待结果的返回。");
                var result = await task;
                context.Response.Write(DateTime.Now.ToString("
    HH:mm:ss") + "    [10000的任务]已经返回。");
                var result2 = await task2;
                context.Response.Write(DateTime.Now.ToString("
    HH:mm:ss") + "    [20000的任务]已经返回。");
                sw.Stop();
                context.Response.Write(DateTime.Now.ToString("
    HH:mm:ss") + "    全部执行完成。总共用时:" + sw.ElapsedMilliseconds + "ms");
            }
            public async Task<string> ExecuteTask(HttpContext context, int time)
            {
                context.Response.Write(DateTime.Now.ToString("
    HH:mm:ss") + "    ["+ time + "的任务]进入ExecuteTask,将StartNewTask。");
                var task = Task.Factory.StartNew<string>(InnerTask, new { time = time, context = context });
                context.Response.Write(DateTime.Now.ToString("
    HH:mm:ss") + "    [" + time + "的任务]创建任务完成,并已开始异步执行,这里将等5秒。");
                System.Threading.Thread.Sleep(5000);
                context.Response.Write(DateTime.Now.ToString("
    HH:mm:ss") + "    [" + time + "的任务]5秒等待完成,将取得结果。");
                var result = await task;
                context.Response.Write(DateTime.Now.ToString("
    HH:mm:ss") + "    [" + time + "的任务]取得结果完成。");
                return result;
            }
            public string InnerTask(dynamic args)
            {
                args.context.Response.Write(DateTime.Now.ToString("
    HH:mm:ss") + "   [" + args.time + "的任务]InnerTask已进入");
                System.Threading.Thread.Sleep(args.time);
                args.context.Response.Write(DateTime.Now.ToString("
    HH:mm:ss") + "   [" + args.time + "的任务]InnerTask执行完成,将返回结果。");
                return "";
            }
            public override void ProcessRequest(HttpContext context)
            {
                base.ProcessRequest(context);
            }
        }

    三、运行效果。

      浏览器上输入:http://localhost:39510/handler/asynchandler.ashx

    11:26:52    开始异步ProcessRequestAsync
    11:26:52    创建异步执行代码任务,并设置任务耗时10000。
    11:26:52    [10000的任务]进入ExecuteTask,将StartNewTask。
    11:26:52    [10000的任务]创建任务完成,并已开始异步执行,这里将等5秒。
    11:26:52   [10000的任务]InnerTask已进入
    11:26:57    [10000的任务]5秒等待完成,将取得结果。
    11:26:57    创建异步执行代码任务,并设置任务耗时20000。
    11:26:57    [20000的任务]进入ExecuteTask,将StartNewTask。
    11:26:57    [20000的任务]创建任务完成,并已开始异步执行,这里将等5秒。
    11:26:57   [20000的任务]InnerTask已进入
    11:27:02    [20000的任务]5秒等待完成,将取得结果。
    11:27:02    继续执行代码,并等待3秒。
    11:27:02   [10000的任务]InnerTask执行完成,将返回结果。
    11:27:05    开始等待结果的返回。
    11:27:05    [10000的任务]取得结果完成。
    11:27:05    [10000的任务]已经返回。
    11:27:17   [20000的任务]InnerTask执行完成,将返回结果。
    11:27:17    [20000的任务]取得结果完成。
    11:27:17    [20000的任务]已经返回。
    11:27:17    全部执行完成。总共用时:25003ms

    四、结果分析:

     图中是争对10000ms的任务的分析。所以说,异步Task在StartNew时,或者调用async的方法时,方法体已经开始使用异步执行。当方法体中遇到耗时长的代码(如Thread.Sleep()或另一个任务的await方法)时,主任务将继续向下执行,这个新任务同样也将异步往下执行。当遇到await时,将相继等待任务中的任务执行完成。当最终执行完成时,将返回结果。如果任务提前完成,将存到Task的Result属性中,当await这个Task时,将直接返回这个结果。

  • 相关阅读:
    查询缓存
    Indexes
    计院生活第三章 狂轰乱炸(上)
    JAVA实现文件树
    OGNL表达式语言介绍
    DOM4J使用教程
    css 优先级
    《JavaScript凌厉开发 Ext详解与实践》3月5日开始上架销售
    Drools 规则引擎
    OLTP和OLAP区别
  • 原文地址:https://www.cnblogs.com/songxingzhu/p/5895748.html
Copyright © 2011-2022 走看看