异步一般处理程序的用法
一、新建空的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("\r\nHH:mm:ss") + " 开始异步ProcessRequestAsync"); context.Response.Write(DateTime.Now.ToString("\r\nHH:mm:ss") + " 创建异步执行代码任务,并设置任务耗时10000。"); var task = ExecuteTask(context, 10000); context.Response.Write(DateTime.Now.ToString("\r\nHH:mm:ss") + " 创建异步执行代码任务,并设置任务耗时20000。"); var task2 = ExecuteTask(context, 20000); context.Response.Write(DateTime.Now.ToString("\r\nHH:mm:ss") + " 继续执行代码,并等待3秒。"); System.Threading.Thread.Sleep(3000); context.Response.Write(DateTime.Now.ToString("\r\nHH:mm:ss") + " 开始等待结果的返回。"); var result = await task; context.Response.Write(DateTime.Now.ToString("\r\nHH:mm:ss") + " [10000的任务]已经返回。"); var result2 = await task2; context.Response.Write(DateTime.Now.ToString("\r\nHH:mm:ss") + " [20000的任务]已经返回。"); sw.Stop(); context.Response.Write(DateTime.Now.ToString("\r\nHH:mm:ss") + " 全部执行完成。总共用时:" + sw.ElapsedMilliseconds + "ms"); } public async Task<string> ExecuteTask(HttpContext context, int time) { context.Response.Write(DateTime.Now.ToString("\r\nHH:mm:ss") + " ["+ time + "的任务]进入ExecuteTask,将StartNewTask。"); var task = Task.Factory.StartNew<string>(InnerTask, new { time = time, context = context }); context.Response.Write(DateTime.Now.ToString("\r\nHH:mm:ss") + " [" + time + "的任务]创建任务完成,并已开始异步执行,这里将等5秒。"); System.Threading.Thread.Sleep(5000); context.Response.Write(DateTime.Now.ToString("\r\nHH:mm:ss") + " [" + time + "的任务]5秒等待完成,将取得结果。"); var result = await task; context.Response.Write(DateTime.Now.ToString("\r\nHH:mm:ss") + " [" + time + "的任务]取得结果完成。"); return result; } public string InnerTask(dynamic args) { args.context.Response.Write(DateTime.Now.ToString("\r\nHH:mm:ss") + " [" + args.time + "的任务]InnerTask已进入"); System.Threading.Thread.Sleep(args.time); args.context.Response.Write(DateTime.Now.ToString("\r\nHH: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时,将直接返回这个结果。
宋兴柱:转载内容,请标明出处,谢谢!源文来自 宝贝云知识分享:https://www.dearcloud.cn
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
2015-09-22 Windows服务安装与控制