await和async在一般处理程序中的使用-阿里云开发者社区

开发者社区> ghost丶桃子> 正文

await和async在一般处理程序中的使用

简介:
+关注继续查看

写在前面

有个小项目,前端使用的html页面,那服务端的业务处理就采用最简单的一般处理程序了,之前一直在用,觉得一直用一种方式,确实挺蛋疼的,之前也有了解过async和await的内容。就想着自己折腾折腾。

代码

前端ajax请求

复制代码
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>新年签到,赢奖品</title>
</head>
<body>
    <div id="dvMsg"></div>
</body>
</html>
<script src="Js/jquery-2.1.1.min.js"></script>
<script>
    $(function () {
        $.getJSON("Ashx/GetUserInfoAsync.ashx", function (data) {
            console.log(data);
            $('#dvMsg').html(data);
        });
    });
</script>
复制代码

一般处理程序

复制代码
  /// <summary>
    /// GetUserInfoAsync 的摘要说明
    /// </summary>
    public class GetUserInfoAsync : IHttpHandler
    {
        public async void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/plain";
            var name = await GetUserAsync();
            context.Response.Write(name);

        }
        private async Task<string> GetUserAsync()
        {
            return await Task.Run(() =>
            {
                return "异步handler";
            });
        }
        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
复制代码

以为这样就大功告成了。其实这才是悲剧的开始。

满足使用async和await的条件了?

调用的目标方法必须是async的。所以就想着在ProcessRequest方法前加个async就可以了吧。其实不然,在使用async的地方也有特别的要求。

 

详情

大概意思就是异步操作,只能在异步模块中进行。所以就很奇怪了。之前在控制台程序中,也是给Main方法直接添加async的。这里就不行了。

经过查找,发现这样的一个类

复制代码
using System;
using System.ComponentModel;
using System.Threading.Tasks;

namespace System.Web
{
    // 摘要: 
    //     提供方法,从而衍生的任务处理程序类可实施该方法以处理异步任务。
    public abstract class HttpTaskAsyncHandler : IHttpAsyncHandler, IHttpHandler
    {
        // 摘要: 
        //     从派生类中的构造函数中调用,用于初始化 System.Web.HttpTaskAsyncHandler 类。
        protected HttpTaskAsyncHandler();

        // 摘要: 
        //     当在派生类中重写时,将获取一个指示任务处理程序类实例是否可重用于另一异步任务的值。
        //
        // 返回结果: 
        //     如果重复使用处理程序,则为 true;否则为 false。 默认值为 false。
        public virtual bool IsReusable { get; }

        // 摘要: 
        //     当在派生类中重写时,将提供处理同步任务的代码。
        //
        // 参数: 
        //   context:
        //     HTTP 上下文。
        //
        // 异常: 
        //   System.NotSupportedException:
        //     方法实现但不提供任何默认用于异步任务的处理程序。
        [EditorBrowsable(EditorBrowsableState.Never)]
        public virtual void ProcessRequest(HttpContext context);
        //
        // 摘要: 
        //     当在派生类中重写时,将提供处理异步任务的代码。
        //
        // 参数: 
        //   context:
        //     HTTP 上下文。
        //
        // 返回结果: 
        //     异步任务。
        public abstract Task ProcessRequestAsync(HttpContext context);
    }
}
复制代码

发现这个抽象类实现自IHttpAsyncHandler, IHttpHandler这两个接口,肯定能满足需求了。那么接下来就对一般处理程序进行改造

复制代码
    /// <summary>
    /// GetUserInfoAsync 的摘要说明
    /// </summary>
    public class GetUserInfoAsync : HttpTaskAsyncHandler
    {
        private async Task<string> GetUserAsync()
        {
            return await Task.Run(() =>
            {
                return "异步handler";
            });
        }public override async Task ProcessRequestAsync(HttpContext context)
        {
            context.Response.ContentType = "text/plain";
            var name = await GetUserAsync();
            context.Response.Write(name);
        }
    }
复制代码

这样就很方便的将一般处理程序变成一个异步处理的了。

总结

没事折腾一下代码,最近在博客园中看到关于await和async的文章,另外手上也有一个项目,就想着能不能使用异步的方式。所以就有了这篇文章。

博客地址: http://www.cnblogs.com/wolf-sun/
博客版权: 本文以学习、研究和分享为主,欢迎转载,但必须在文章页面明显位置给出原文连接。
如果文中有不妥或者错误的地方还望高手的你指出,以免误人子弟。如果觉得本文对你有所帮助不如【推荐】一下!如果你有更好的建议,不如留言一起讨论,共同进步!
再次感谢您耐心的读完本篇文章。http://www.cnblogs.com/wolf-sun/p/5069382.html

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
C#.NET使用Task,await,async,异步执行控件耗时事件(event),不阻塞UI线程和不跨线程执行UI更新,以及其他方式比较
原文:C#.NET使用Task,await,async,异步执行控件耗时事件(event),不阻塞UI线程和不跨线程执行UI更新,以及其他方式比较 使用Task,await,async,异步执行事件(event),不阻塞UI线程和不跨线程执行UI更新   使用Task,await,async 的异步模式 去执行事件(event) 解决不阻塞UI线程和不夸跨线程执行UI更新报错的最佳实践,附加几种其他方式比较 由于是Winform代码和其他原因,本文章只做代码截图演示,不做界面UI展示,当然所有代码都会在截图展示。
3316 0
C++实践参考——处理C++源代码的程序
【项目 - 处理C++源代码的程序】   在CodeBlocks等IDE中都提供了代码格式整理的功能。完成这种功能的程序,操作的数据是用C++写的源代码文件。C++源文件是一种文本文件,可以通过程序进行操作。集成开发环境(IDE)对对程序进行编译,操作的“数据”是源程序。编译中,要对源程序进行词法检查和语法检查,后续还要进行目标代码生成、代码优化等工作。相关的技术将在《编译原理》课中学习。这些
921 0
如何处理Maven build时的error message Unable to locate the Javac Compiler in tools.jar
如何处理Maven build时的error message Unable to locate the Javac Compiler in tools.jar
13 0
C/C++程序编译流程(预处理-&gt;编译-&gt;汇编-&gt;链接)
程序的基本流程如图: 1. 预处理 预处理相当于根据预处理指令组装新的C/C++程序。经过预处理,会产生一个没有宏定义,没有条件编译指令,没有特殊符号的输出文件,这个文件的含义同原本的文件无异,只是内容上有所不同。
759 0
php 发送超大数据处理
set_time_limit(0);//设置永不超时 ignore_user_abort(); //设置客户端断开,继续处理 //总数 $allusercount= $this->gamedb_model->query_onerow(); $allcoun...
565 0
Asp.Net Web API 2第七课——Web API异常处理
原文:Asp.Net Web API 2第七课——Web API异常处理 前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.
806 0
linux内核分析笔记----中断和中断处理程序
中断还是中断,我讲了很多次的中断了,今天还是要讲中断,为啥呢?因为在操作系统中,中断是必须要讲的..        那么什么叫中断呢, 中断还是打断,这样一说你就不明白了。唉,中断还真是有点像打断。
673 0
1955
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载