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的文章,另外手上也有一个项目,就想着能不能使用异步的方式。所以就有了这篇文章。

原文地址:https://www.cnblogs.com/Jeely/p/11062602.html

时间: 2024-10-03 02:37:36

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

小心C# 5.0 中的await and async模式造成的死锁

平时在使用C# 5.0中的await and async关键字的时候总是没注意,直到今天在调试一个ASP.NET项目时,发现在调用一个声明为async的方法后,程序老是莫名其妙的被卡住,就算声明为async的方法中的Task任务执行完毕后,外部方法的await调用还是阻塞着,后来查到了下面这篇文章,才恍然大悟原来await and async模式使用不当很容易造成程序死锁,下面这篇文章通过一个Winform示例和一个Asp.net示例介绍了await and async模式是如何造成程序死锁的,

【笔记】记一次.net语法await和async的异步编程实验与笔记。

1.实践代码全记录: using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace await_测试 { class Program { static void Main(string[] args) { te

C#语法——await与async的正确打开方式

C#5.0推出了新语法,await与async,但相信大家还是很少使用它们.关于await与async有很多文章讲解,但有没有这样一种感觉,你看完后,总感觉这东西很不错,但用的时候,总是想不起来,或者不知道该怎么用. 为什么呢?我觉得大家的await与async的打开方式不正确. 正确的打开方式 首先看下使用约束. 1.await 只能在标记了async的函数内使用. 2.await 等待的函数必须标记async. 有没有感觉这是个循环?没错,这就是个循环.这也就是为什么大家不怎么用他们的原因.

今天学习了在一般处理程序中写一个计算器

今天看了看前面的javascript以及学习的jquery,感觉刚开始学习时间就赶得比较紧,练习是做啦,基础的知识都是知道的,但是在写一些小小的程序时间还是陌生,感觉练习的还是很不够的,其实怎么说那,想好好的学习还是把他们使用到项目中练习就会学习的更快些吧,然后我又做啦一个增删改查的一般处理程序,但是还没有总结好,现在就简单的先总结一个小小的计算器使用html和ashx来实现一下其功能,如下所示: 一.html样式 <script> //@Script; </script> <

ASP.NET中在一般处理程序中使用session的简单介绍

这篇文章介绍了ASP.NET中在一般处理程序中使用session,有需要的朋友可以参考一下 <%@ WebHandler Language="C#" Class="ChangePwd" %> using System; using System.Web; using System.Web.SessionState; public class ChangePwd : IHttpHandler, IReadOnlySessionState { public

关于在一般处理程序中实现基础验证码

验证码是一个图片是动态生成的,一般的验证码保存在服务器中. 要在一般处理程序中使用session必须实现System.Web.SessionState.IRequiresSessionState 接口不然会出现找不到session的错误. public void ProcessRequest (HttpContext context) { context.Response.ContentType = "image/JPEG";//这里要改正格式以前为(text/plan) //创建一个

一般处理程序中Session失败解决方案

解决方法: 在实现IHttpHandler的同时,也要实现IRequiresSessionState接口,其命名空间为:System.Web.SessionState. public class Logout : IHttpHandler, System.Web.SessionState.IRequiresSessionState{} IRequiresSessionState ,指定目标 HTTP 处理程序需要对会话状态值具有读写访问权.这是一个标记接口,没有任何方法. 作用:在自定义 HTT

在一般处理程序中,把Form Post过来的表单集合转换成对象 ,仿 MVC post,反射原理

using System; using System.Collections.Generic; using System.Collections.Specialized; using System.Linq; using System.Reflection; using System.Web; using WebSite.Models; namespace testWebuploader.Scripts.Plugin.webuploader_v0._1._2 { /// <summary> /

一般处理程序中使用Session出现未将对象引用设置到对象的实例

遇到问题:未将对象引用设置到对象的实例 那就在你的一般处理程序中加入红色背景的代码吧 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Data; using System.Web.SessionState; //引用命名空间 namespace gl.webweb.gl_web.ashx { //实现接口 public class login : I