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
时间: 2024-09-08 18:46:21

await和async在一般处理程序中的使用的相关文章

interrupt-中断处理程序中不能使用自旋锁

问题描述 中断处理程序中不能使用自旋锁 大神们,我看了一本书,说 :在中断处理程序中不能使用自旋锁,不明白,请大师指点 渣渣 拜谢! 解决方案 http://bbs.csdn.net/topics/350203885 解决方案二: 不知道....... 解决方案三: 书里面是怎么说的?看看书里面有没有说什么意思 解决方案四: 你看错了吧,中断处理中只能用自旋锁!

HttpRuntime.Cache在一般处理程序中设置了值,当下一次请求时,里面又重置,不知道怎么回事

问题描述 HttpRuntime.Cache在一般处理程序中设置了值,当下一次请求时,里面又重置.然后我又再Global里添加静态变量,在一般处理程序中对其进行更改,在下一次请求也重置了....iis没有重启--代码如下:publicclassGlobal:System.Web.HttpApplication{publicstaticintlist=0;}这是一般处理程序中的:Global.list++;HttpRuntime.Cache.Insert(("m"+mid),m,null

Windows 8开发入门(五)弹出提示框MessageDialog与await、async关键字

在以前Silverlight.WPF中的弹出窗口提示中是MessageBox类中进行显示的,现在Windows 8中使用 Windows.UI.Popups命名空间下的MessageDialog类代替MessageBox. MessageDialog类有以下常用方法 和属性: ShowAsync():异步弹出消息框. Commands:添加命令,在弹出框界面上同步添加相应的按 钮. DefaultCommandIndex:设置默认按钮的索引,按ENTER键将激活该索引对应的命令按钮 Cancel

C#——await与async实现多线程异步编程

           以前,我们或许用过Thread,在主线程执行的时候,新开另一个新线程,来执行新方法.            今天看别人发给我的一段代码的时候发现了一个不认识的await,但是又感觉很熟悉的样子,感觉是线程那块儿的东西,查了下,发现一个简单的方法实现多线程异步编程.(PS:framework 在4.5以上才可以哦~)        /// <summary> /// 测试方法 /// </summary> /// <remarks>创建者:刘慧超;

一般处理程序中checkbox传值问题

问题描述 需求:在前台html页面点击checkbox按钮,ashx接受请求并做处理.若checkbox已选中,则将数据库中的false改为true,编辑的时候将数据库中的记录的数据返回checkbox,true就打上勾.问题:checkbox不管选中不选中,ashx程序中收到的boolisRecommend=Convert.ToBoolean(context.Request["IsRecommend"]);始终为false.<p>是否设为推荐产品:<inputtyp

一般处理程序中利用Nvelocity模板实现分页出现的问题

问题描述 实现分页过程中,运行程序点击上一页的时候提示输入字符串格式不正确.#set($firstPage=1)#if($Data.Page>$firstPage)#set($lastPage="$Data.Page-1")这里出现的问题,当减号改成加好就正确了,请问这是怎么回事?context.Response.ContentType="text/html";intpage=1;if(context.Request["Page"]!=nu

如何在现有代码中通过async/await实现并行

一项新技术或者一个新特性,只有你用它解决实际问题后,才能真正体会到它的魅力,真正理解它.也期待大家能够多分享解一些解决实际问题的内容. 在我们遭遇"黑色30秒"问题的过程中,切身体会到了异步的巨大作用(详见从ASP.NET线程角度对"黑色30秒"问题的全新分析),于是开始逐步地用async/await改造现有代码. 今天早上在将一个MVC Controller中的Action改为异步的时候突然发现--其中有7个方法调用可以并行执行. public async Tas

async And await异步编程活用基础

原文:async And await异步编程活用基础 好久没写博客了,时隔5个月,奉上一篇精心准备的文章,希望大家能有所收获,对async 和 await 的理解有更深一层的理解. async 和 await 有你不知道的秘密,微软会告诉你吗? 我用我自己的例子,去一步步诠释这个技术,看下去,你绝对会有收获.(渐进描述方式,愿适应所有层次的程序员) 从零开始, 控制台 Hello World: 什么?开玩笑吧?拿异步做Hello World?? 下面这个例子,输出什么?猜猜? 1 static

C# async/await 使用总结

今天搞这两个关键字搞得有点晕,主要还是没有彻底理解其中的原理.   混淆了一个调用异步方法的概念: 在调用异步方法时,虽然方法返回一个 Task,但是其中的代码已经开始执行.该方法在调用时,即刻执行了一部分代码,直接最底层的 Async API 处才产生真正的异步操作,这时向上逐步返回,并最终使用一个 Task 来代表该异步任务. 当不使用 await 关键字时,该异步方法同样在异步执行.而使用 await 关键字后,只不过是对 Task(awaitable) 对象异步等待其执行结束,然后再同上