0

0

充分发挥异步在 ASP.NET 中的强大优势

高洛峰

高洛峰

发布时间:2016-11-21 18:01:29

|

1644人浏览过

|

来源于php中文网

原创

最近几年,异步编程受到极大关注,主要是出于两个关键原因:首先,它有助于提供更好的用户体验,因为不会阻塞 ui 线程,避免了处理结束前出现 ui 界面挂起。其次,它有助于大幅扩展系统,而且无需添加额外硬件。

但是,编写合适的异步代码来管理线程本身是项乏味的工作。虽然如此,其巨大好处让许多新旧技术纷纷开始使用异步编程。微软自发布了 .NET 4.0以后也对其投入颇多,随后在 .NET 4.5中引入了 async 和 await 关键字,使异步编程变得前所未有地简单。

但是,ASP.NET 中的异步功能自一开始就可以使用,只是从来没有得到应有的重视。而且,考虑到 ASP.NET 和 IIS 处理请求的方式,异步体现的优势可能更明显。通过异步,我们很容易就可以大幅提高 ASP.NET 应用程序的扩展性。随着新的编程结构引入,如 async 和 await 关键字,我们也应该学会使用异步编程的强大功能。

在本篇博文中,我们将讨论一下 IIS 和 ASP.NET 处理请求的方式,然后看看 ASP.NET 中哪些地方可以使用异步,最后再讨论几个最能体现异步优势的场景。

请求是如何处理的?

每个 ASP.NET 请求都要先通过 IIS,然后再由 ASP.NET 处理程序进行最终处理。 首先IIS 接收请求,初步处理后,发送给ASP.NET(必须是一个ASP.NET请求),然后由ASP.NET进行实际处理并生成响应,之后该响应通过IIS发回给客户。在IIS上,有一些工作进程负责从队列中取出请求,并执行IIS 模块,然后再将该请求发送到ASP.NET 队列。但是,ASP.NET本身不创建任何线程,也没有处理请求的线程池,而是通过使用CLR 线程池,从中获取线程来处理请求。因此,IIS 模块调用ThreadPool.QueueUserWorkItem,将请求排入队列,供CLR 工作线程处理。我们都知道,CLR线程池是由CLR管理,并且能够自动调整(也就是说,它根据需要创建和销毁进程)。这里还要记住,创建和销毁线程是项很繁重的任务,这就是为什么CLR线程池允许使用同一个线程处理多个任务。下面来看一个描述请求处理过程的图示。

t0128f824aa7ed65fdd.png

在上图中可以看到,请求首先由 HTTP.sys接收,并添加到相应内核级应用程序池队列。然后,一个IIS工作线程从队列中取出请求,处理后将其传到ASP.NET 队列。注意,该请求如果不是一个ASP.NET请求,将从 IIS 自动返回。最后,从CLR线程池中分配一个线程,负责处理该请求。

ASP.NET中异步的使用场景是?

所有请求大致可以分为两类:

CPU Bound 类

I/O Bound 类

CPU Bound 类请求,需要 CPU 时间,而且是在同一进程中执行;而 I/O Bound 类请求,本身具有阻塞性,需要依赖其他模块执行 I/O 操作并返回响应。阻塞性请求是提高应用程序可伸缩性的主要障碍,而且大多数web应用程序中,在等待 I/O 操作的过程中浪费了大量时间。 因此以下场景适合使用异步:

I/O Bound 类请求,包括:

数据库访问

读/写文件

Web 服务调用

访问网络资源

事件驱动的请求,比如SignalR

需要从多个数据源获取数据的场景

齐博B2B电子商务系统v1.0模板 绿色模板1.0
齐博B2B电子商务系统v1.0模板 绿色模板1.0

1、支持易宝支付、支付宝、财付通在线支付。 2、支持普通会员、VIP、代理三种会员体系,认证体系分金、银、普通三类。 3、PHP168首创的标签技术应用,支持强大而易用的所见所得的标签操作功能。 4、商家会员管理中心,一站式会员操作管理,包括充值、发布产品、信息推广等20余个操作模块。 5、支持销售报价。 6、实用的在线交流体系,支持站内短信、留言本。 7、支持整站内手机体系应用。 8、优秀的个性

下载

作为示例,这里创建一个简单的同步页面,然后再将它转换成异步页面。 本示例设置了1000ms的延迟(以模拟一些繁重的数据库或web服务调用等),而且还使用WebClient下载了一个页面,如下所示:

    protected void Page_Load(object sender, EventArgs e)

    {

        System.Threading.Thread.Sleep(1000);

        WebClient client = new WebClient();

        string downloadedContent = client.DownloadString("https://msdn.microsoft.com/en-us/library/hh873175%28v=vs.110%29.aspx");

        dvcontainer.InnerHtml = downloadedContent;

    }

现在将该页面转换成异步页面,这里主要涉及三个步骤:

在页面指令中添加Async = true,将该页面转换成异步页面,如下所示:

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Home.aspx.cs" Inherits="AsyncTest.Home" Async="true" AsyncTimeout="3000" %>

这里还添加了 AsyncTimeout (可选项),请根据需求选择。

2.将此方法转换成异步方法。在这里把Thread.Sleep 与 client.DownloadString 转换成异步方法如下所示:

    private async Task AsyncWork()

    {

        await Task.Delay(1000);

        WebClient client = new WebClient();

        string downloadedContent = await client.DownloadStringTaskAsync("https://msdn.microsoft.com/en-us/library/hh873175%28v=vs.110%29.aspx ");

        dvcontainer.InnerHtml = downloadedContent;
 
    }

3.现在可以直接在 Page_Load (页面加载)上调用此方法,使其异步,如下所示:

    
    protected async void Page_Load(object sender, EventArgs e)

    {
        await AsyncWork();
    }

但是这里的 Page_Load 返回的类型是async void,这种情况无论如何都应该避免。我们知道,Page_Load 是整个页面生命周期的一部分,如果我们把它设置成异步,可能会出现一些异常情况和事件,比如生命周期已经执行完毕而页面加载仍在运行。 因此,强烈建议大家使用 RegisterAsyncTask 方法注册异步任务,这些异步任务会在生命周期的恰当时间执行,可以避免出现任何问题。

    protected void Page_Load(object sender, EventArgs e)
    {
        RegisterAsyncTask(new PageAsyncTask(AsyncWork));
    }

现在,页面已经转换成了异步页,它就不再是一个阻塞性请求。

笔者在 IIS8.5 上部署了同步页面和异步页面,并使用突发负载对两者进行了测试。测试结果发现,相同的机器配置,同步页面在2-3秒内只能提取1000个请求,而异步页面能够为2200多个请求提供服务。此后,开始收到超时(Timeout)或服务器不可用(Server Not Available)的错误。虽然两者的平均请求处理时间没有多大差别,但是通过异步页面,可以处理两倍以上的请求。这足以证明异步编程功能强大,所以应该充分利用它的优势。

ASP.NET中还有几个地方也可以引入异步:

编写异步模块

使用IHttpAsyncHandler 或 HttpTaskAsyncHandler 编写异步HTTP处理程序

使用web sockets 或 SignalR

结论

本篇博文中,我们讨论了异步编程,而且发现,新推出的async 和 await关键字,使异步编程变得十分简单。我们讨论的话题包括 IIS和ASP.NET如何处理请求,以及在哪些场景中异步的作用最明显。另外,我们还创建了一个简单示例,讨论了异步页面的优势。最后我们还补充了几个ASP.NET中可以使用异步的地方。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
拼多多赚钱的5种方法 拼多多赚钱的5种方法
拼多多赚钱的5种方法 拼多多赚钱的5种方法

在拼多多上赚钱主要可以通过无货源模式一件代发、精细化运营特色店铺、参与官方高流量活动、利用拼团机制社交裂变,以及成为多多进宝推广员这5种方法实现。核心策略在于通过低成本、高效率的供应链管理与营销,利用平台社交电商红利实现盈利。

28

2026.01.26

edge浏览器怎样设置主页 edge浏览器自定义设置教程
edge浏览器怎样设置主页 edge浏览器自定义设置教程

在Edge浏览器中设置主页,请依次点击右上角“...”图标 > 设置 > 开始、主页和新建标签页。在“Microsoft Edge 启动时”选择“打开以下页面”,点击“添加新页面”并输入网址。若要使用主页按钮,需在“外观”设置中开启“显示主页按钮”并设定网址。

8

2026.01.26

苹果官方查询网站 苹果手机正品激活查询入口
苹果官方查询网站 苹果手机正品激活查询入口

苹果官方查询网站主要通过 checkcoverage.apple.com/cn/zh/ 进行,可用于查询序列号(SN)对应的保修状态、激活日期及技术支持服务。此外,查找丢失设备请使用 iCloud.com/find,购买信息与物流可访问 Apple (中国大陆) 订单状态页面。

31

2026.01.26

npd人格什么意思 npd人格有什么特征
npd人格什么意思 npd人格有什么特征

NPD(Narcissistic Personality Disorder)即自恋型人格障碍,是一种心理健康问题,特点是极度夸大自我重要性、需要过度赞美与关注,同时极度缺乏共情能力,背后常掩藏着低自尊和不安全感,影响人际关系、工作和生活,通常在青少年时期开始显现,需由专业人士诊断。

3

2026.01.26

windows安全中心怎么关闭 windows安全中心怎么执行操作
windows安全中心怎么关闭 windows安全中心怎么执行操作

关闭Windows安全中心(Windows Defender)可通过系统设置暂时关闭,或使用组策略/注册表永久关闭。最简单的方法是:进入设置 > 隐私和安全性 > Windows安全中心 > 病毒和威胁防护 > 管理设置,将实时保护等选项关闭。

5

2026.01.26

2026年春运抢票攻略大全 春运抢票攻略教你三招手【技巧】
2026年春运抢票攻略大全 春运抢票攻略教你三招手【技巧】

铁路12306提供起售时间查询、起售提醒、购票预填、候补购票及误购限时免费退票五项服务,并强调官方渠道唯一性与信息安全。

35

2026.01.26

个人所得税税率表2026 个人所得税率最新税率表
个人所得税税率表2026 个人所得税率最新税率表

以工资薪金所得为例,应纳税额 = 应纳税所得额 × 税率 - 速算扣除数。应纳税所得额 = 月度收入 - 5000 元 - 专项扣除 - 专项附加扣除 - 依法确定的其他扣除。假设某员工月工资 10000 元,专项扣除 1000 元,专项附加扣除 2000 元,当月应纳税所得额为 10000 - 5000 - 1000 - 2000 = 2000 元,对应税率为 3%,速算扣除数为 0,则当月应纳税额为 2000×3% = 60 元。

12

2026.01.26

oppo云服务官网登录入口 oppo云服务登录手机版
oppo云服务官网登录入口 oppo云服务登录手机版

oppo云服务https://cloud.oppo.com/可以在云端安全存储您的照片、视频、联系人、便签等重要数据。当您的手机数据意外丢失或者需要更换手机时,可以随时将这些存储在云端的数据快速恢复到手机中。

40

2026.01.26

抖币充值官方网站 抖币性价比充值链接地址
抖币充值官方网站 抖币性价比充值链接地址

网页端充值步骤:打开浏览器,输入https://www.douyin.com,登录账号;点击右上角头像,选择“钱包”;进入“充值中心”,操作和APP端一致。注意:切勿通过第三方链接、二维码充值,谨防受骗

7

2026.01.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
ASP.NET参考手册
ASP.NET参考手册

共0课时 | 0人学习

传播智客ASP.NET中级系列视频教程
传播智客ASP.NET中级系列视频教程

共33课时 | 6.4万人学习

传播智客ASP.NET高级系列视频教程
传播智客ASP.NET高级系列视频教程

共34课时 | 6.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号