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的文章,另外手上也有一个项目,就想着能不能使用异步的方式。所以就有了这篇文章。
await和async在一般处理程序中的使用的更多相关文章
- 小心C# 5.0 中的await and async模式造成的死锁
平时在使用C# 5.0中的await and async关键字的时候总是没注意,直到今天在调试一个ASP.NET项目时,发现在调用一个声明为async的方法后,程序老是莫名其妙的被卡住,就算声明为as ...
- C#同步,异步的理解,包括5.0中await和async(学习笔记)
之前在工作中一直用的是同步线程,就是先进入画面的load事件,然后在里面进行数据库调用的处理.后面又遇到了公司软件中一些比较古老的代码,一开始在那块古老代码中增加机能的时候,我想用到数据库的数据给画面 ...
- [转]小心C# 5.0 中的await and async模式造成的死锁
原文链接 https://www.cnblogs.com/OpenCoder/p/4434574.html 内容 UI Example Consider the example below. A bu ...
- C#中的异步编程--探索await与async关键字的奥妙之处,原来理解和使用异步编程可以这么简单
前言 await与async是C#5.0推出的新语法,关于await与async有很多文章讲解.但看完后有没有这样一种感觉,感觉这东西像是不错,但好像就是看不太懂,也不清楚该怎么使用.虽然偶有接触,但 ...
- await和async关键字来写异步程序
await和async关键字出现于.Net5.0,方便写异步程序. 例子: public class MyClass { public MyClass() { DisplayValue(); //这里 ...
- 【笔记】记一次.net语法await和async的异步编程实验与笔记。
1.实践代码全记录: using System; using System.Collections.Generic; using System.Diagnostics; using System.Li ...
- await和async更多的理解
最近有不少网友提起await和async,呵呵,C# 5引进的语法糖. 这个语法糖还真不好吃,能绕倒一堆初学的朋友,在网上也有很多网友关于这块知识点的争论,有对有错,今天在这里把这个误区好好讲讲. 在 ...
- C#语法——await与async的正确打开方式
C#5.0推出了新语法,await与async,但相信大家还是很少使用它们.关于await与async有很多文章讲解,但有没有这样一种感觉,你看完后,总感觉这东西很不错,但用的时候,总是想不起来,或者 ...
- C#语法——泛型的多种应用 C#语法——await与async的正确打开方式 C#线程安全使用(五) C#语法——元组类型 好好耕耘 redis和memcached的区别
C#语法——泛型的多种应用 本篇文章主要介绍泛型的应用. 泛型是.NET Framework 2.0 版类库就已经提供的语法,主要用于提高代码的可重用性.类型安全性和效率. 泛型的定义 下面定义了 ...
随机推荐
- node.js中stream流中可读流和可写流的使用
node.js中的流 stream 是处理流式数据的抽象接口.node.js 提供了很多流对象,像http中的request和response,和 process.stdout 都是流的实例. 流可以 ...
- JavaSE基础知识(4)—数组的应用
一.数组的特点.好处及使用步骤 1.数组的好处 特点:相当于用于保存一组元素的容器好处: 1.提高代码的简洁性和扩展性,且同时开辟多个空间,提高了效率 2.分类存储,且空间是连续的,容易查找 2.数组 ...
- ant 执行java文件,java文件中含中文,显示乱码
在build.xml文件run target下添加下面一行 <sysproperty key="file.encoding" value="UTF-8" ...
- dfs | Security Badges
Description You are in charge of the security for a large building, with n rooms and m doors between ...
- Pandas plot出图
1.创建一个Series 这是一个线性的数据,我们随机生成1000个数据,Series 默认的 index 就是从0开始的整数,但是这里我显式赋值以便让大家看的更清楚 >>> imp ...
- String 常用函数
判断字符串是否包含指定字符str.contains("string"); 查找指定字符索引str.indexOf("s"'); 查找最后出现的字符索引str.i ...
- List,set,Map理解
集合 集合与数组 数组(可以存储基本数据类型)是用来存现对象的一种容器,但是数组的长度固定,不适合在对象数量未知的情况下使用. 集合(只能存储对象,对象类型可以不一样)的长度可变,可在多数情况下使用. ...
- Samba简介与配置(匿名&本地用户验证)
Samba简介 Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成. 在此之前我们已经了解了NFS,NFS与samba一样,也是在网络中实现文件共享的一种实 ...
- Codeforces Round #539 (Div. 2) 异或 + dp
https://codeforces.com/contest/1113/problem/C 题意 一个n个数字的数组a[],求有多少对l,r满足\(sum[l,mid]=sum[mid+1,r]\), ...
- NAT 模式下虚拟机安装的centos7 ping主机显示connect: Network is unreachable
在虚拟机下安装的centos7使用的网络是NAT模式,安装成功后ping主机地址显示 Network is unreachable 解决方案: 1)使用ifconfig命令查看网卡信息 2)进入/et ...