首页 程序笔记 mvc async await异步编程

mvc async await异步编程

在mvc中如果要用纯异步请不要使用async和await,可以直接使用Task.Run。

在mvc中使用async和await可以让系统开新线程处理Task的代码,同时不必等Task执行结束,就可以同时运行Task之后的代码,加快效率。

要注意的是:如果使用async和await,系统虽然可以同时处理多个事务,但客户端(浏览器)不会有响应,依然要等到所有代码全部执行完毕(包括异步的代码)才能正常响应。

什么场景下需要异步操作?

在因为磁盘io或网络io而导致的任务执行时间长的时候应该使用异步操作,如果任务执行时间长是因为cpu的消耗则应使用同步操作(此时异步操作不会改善任何问题)

异步原理是什么?

在 Web 服务器上,.NET Framework 维护一个用于服务 ASP.NET 请求的线程池(以下把 .NET Framework 维护的用于服务 ASP.NET 请求的线程池称作为“特定线程池”)

同步操作时,如果特定线程池利用满了,则不会再提供服务

异步操作时:一个请求过来,特定线程池出一个线程处理此请求。启动一个非特定线程池中的另一个线程处理异步操作,此时处理此请求的线程就会空出来,不会被阻塞,它可以继续处理其它请求。异步操作执行完毕后,从特定线程池中随便找一个空闲线程返回请求结果。

实际工作中,async和await我们可以用于类似用户上传头像、上传照片这种的耗时较长的功能中,我们可以在边上传照片时边处理数据库的其他事务。

而纯异步则多用于时间较长,而无需结果实时看反馈给用户的操作,例如:管理在后台备份数据库、清理垃圾文件等。

如果async和await的异步方法是有返回值的,而且主方法中又要使用这个返回值,那么将不会实现多个异步方法同时执行,要等异步结果后才继续执行,相当于异步并未起到多程序同时处理事务的目的。这仅是对于Web或控制台程序而言的,如果对于Winform则有大大的不同,因为Winform如果使用异步时界面是可以响应的。

Web中异步更多的是用来实现大量IO操作,或大量调用WCF、WebService时使用。

示例:

[HttpGet]

[Route("api/QRCodes")]

public async Task<IHttpActionResult> Get() {

    var member = this.GetCurrentMember();

    var qr = await GetMemberQRCode(member);

    return this.Success(new {

        QRCode = qr.QRCode,

        LastModifiedAt = qr.LastModifiedAt

    });

}

private async Task<MemberQRCode> GetMemberQRCode(Auction.Models.Membership.Member member) {

    //本方法用以创建二维码

}

以上例子中,其实响应时间并没有因为异步而减少,因为客户端(浏览器)不会有响应,依然要等到所有代码全部执行完毕(包括异步的代码)才能正常响应。但是异步可以空出线程池,增加接口吞吐量。

使用async异步编程时,请注意如下事项:

async void函数只能在UI Event回调中使用。

async void函数中一定要用try-catch捕获所有异常,否则会很容易导致程序崩溃。

async void类型的lambda表达式非常隐蔽,并且容易在无意中编写出来,尤其需要注意。

不要忽视CS4014告警,更不要为了消除CS4014告警而改用async void函数。

确实无需等待的async Task函数用我前面写的扩展函数IgnorCompletion消除这个告警。

注册TaskScheduler.UnobservedTaskException事件,记录Task中未处理异常信息,方便分析及错误定位。

3

站心网

在mvc中如果要用纯异步请不要使用async和await,可以直接使用Task.Run。在mvc中使用async和await可以让系统..

为您推荐

你被入侵了DDOS,吓唬吓唬你

支付宝第三方支付平台对接原理和实现

如果把商户网站使用第三方支付平台(比如支付宝)的原理搞清楚,那编程就变得简单多了。 整个过程大致这样: 1、商户与支付宝签约。 2、在商户网站购买商品,填写数量,确定购买后跳转到结账页面。结账页面可能包括订..

.NET Core 日志配置,NLog配置示例

.NET Core内置的日志组件附带了以堆日志提供程序,输出到控制台,输出,系统事件。在Program.cs组件配置里可以配置,如下。Console和Debug是默认配置。publicstaticIHostBuilderCreateHostBuilder(string[]args)=>Ho..

.Net报错Could not find a part of the path bin\roslyn\csc.exe

维护一个老网站,用vs2022打开后build能成功,但是在IIS里运行的时候会报错:Server Error in '/' Application.Could not find a part of the path '...\bin\roslyn\csc.exe'.Description: An unhan..

IIS中.NET Core报错HTTP Error 500.31 - ANCM Failed to Find Native Dependencies

在IIS部署.NET Core网站报错HTTP Error 500.31 - ANCM Failed to Find Native Dependencies。原因是需要安装.NET Core运行时和ASP.NET Hosting。1 安装.NET Core运行时,目前最新的是ASP.NET Core 运行时 6.0.10(可..

.NET async await最佳实践

.NET 中的 async/await 是用于简化异步编程的关键工具。它允许你以一种类似于同步代码的方式编写异步代码,使得异步操作更加易于理解和维护。在使用 async 和 await 进行异步编程时,以下是一些 .NET 中的最佳实践:..

人工智能AI会淘汰哪些职业?程序员会被替代吗?

最近OpenAI的ChatGPT大火,很多人都坦言人工智能太强大,可以完成很多日常工作,甚至比人做得更好。人工智能(AI)已经开始影响很多行业,因为它能够自动化很多重复性工作,提高效率和准确性。所以很多人担忧人工智..

基于浏览器的流程编辑工具:Node-RED简介

Node-RED是一种编程工具,用于以新颖有趣的方式将硬件设备、API和在线服务连接在一起。它提供了一个基于浏览器的流程编辑器,使您可以轻松地使用设计器中的各种节点将流连接在一起,并且可以一键将其部署到其运行,..

网站防止爬虫采集的方法有哪些?

网站防采集是一种常见的保护措施,用于防止恶意程序或自动化工具通过抓取网站上的数据。以下是一些常见的网站防采集方法:Robots.txt文件:通过在网站根目录下放置robots.txt文件,可以告诉搜索引擎爬虫或其他抓取工..

在.NET开发中,你如何处理高并发和大数据量的情况?请谈谈你在这方面的经验和使用的工具

在.NET开发中处理高并发和大数据量的情况是一个关键的挑战。以下是一些我在这方面的经验和使用的工具:异步编程:使用异步编程模型(如async/await关键字)可以提高应用程序的并发性能。通过异步操作,可以释放主线..

CentOS7安装unzip解压工具命令使用方法

CentOS7可以通过yum命令安装支持zip的工具unzip,下面是安装和使用的方法。安装unzip工具yuminstall-yunzipzip使用unzip命令解压zip文件#解压到当前目录下unziptest.zip#使用-d参数解压到指定目录下unzip-d/filestes..

程序员失业了可以做什么?转行还是创业?

程序员可以转行哪些职业?程序员失业后,可以考虑转行到以下领域:数据分析师:数据分析是一个快速发展的领域,需要掌握数据分析工具和编程技能。程序员已经具备了编程技能,可以通过学习数据分析工具(如Python和R..

linux中Qt工程编译报错: error: 找不到 -lGL

编译一个Qt项目报错:Qt error: 找不到 -lGL这是因为 Qt编译器找不到 OpenGL 的动态链接库(libGL.so)。 在大部分 Linux 发行版中都是默认安装OpenGL,包括 Ubuntu、CentOS 等,找不到该链接库一般都是路径不对,如..

JS判断连续输入完成

JS如何判断连续输入完?js判断输入结束可以通过下面这个jquery插件完美实现。引用js文件:http://www.leavescn.com/static/script/donetyping.js(未压缩前大小为3K)使用方法:$('#{你的input输入框的id}')..

C#中await/async异步编程采坑—async方法可能会同步执行

前言在C# 5.0和.NET 4.5中,引入了基于await/async的异步编程模式,也称为“基于任务的异步编程模型 (TAP) ”。它有效地避免了异步任务回调嵌套的地狱,而且非常易于使用,但是深度理解它却比学会使用它要困难得多。..

C# async/await最佳实践

在C#中,async/await 是处理异步操作的重要工具,它可以改善代码的可读性和性能。以下是一些async/await的最佳实践:1. 始终遵循命名规范对于异步方法,请使用以 "Async" 结尾的命名约定。这有助于识别异步方法并遵..

.NET C#中的 async/await 原理

在.NET中,await关键字是用于异步编程的重要工具,它允许我们以同步的方式编写异步代码,从而提高代码的可读性和可维护性。本文将深入探讨.NET中await的工作原理,包括其背后的机制、如何影响代码执行流程,以及为何..

.NET C#异步编程async/await最佳实践

在 .NET C# 中,异步编程是一种常用的技术,可以提高应用程序的性能和响应能力。async/await 是 C# 中用于异步编程的关键字对。异步编程允许你编写更加高效的代码,特别是在需要等待 I/O 操作(如文件读写、网络请求..

发表回复

返回顶部