在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
为您推荐
如果把商户网站使用第三方支付平台(比如支付宝)的原理搞清楚,那编程就变得简单多了。 整个过程大致这样: 1、商户与支付宝签约。 2、在商户网站购买商品,填写数量,确定购买后跳转到结账页面。结账页面可能包括订..
.NET Core内置的日志组件附带了以堆日志提供程序,输出到控制台,输出,系统事件。在Program.cs组件配置里可以配置,如下。Console和Debug是默认配置。publicstaticIHostBuilderCreateHostBuilder(string[]args)=>Ho..
维护一个老网站,用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。原因是需要安装.NET Core运行时和ASP.NET Hosting。1 安装.NET Core运行时,目前最新的是ASP.NET Core 运行时 6.0.10(可..
.NET 中的 async/await 是用于简化异步编程的关键工具。它允许你以一种类似于同步代码的方式编写异步代码,使得异步操作更加易于理解和维护。在使用 async 和 await 进行异步编程时,以下是一些 .NET 中的最佳实践:..
最近OpenAI的ChatGPT大火,很多人都坦言人工智能太强大,可以完成很多日常工作,甚至比人做得更好。人工智能(AI)已经开始影响很多行业,因为它能够自动化很多重复性工作,提高效率和准确性。所以很多人担忧人工智..
Node-RED是一种编程工具,用于以新颖有趣的方式将硬件设备、API和在线服务连接在一起。它提供了一个基于浏览器的流程编辑器,使您可以轻松地使用设计器中的各种节点将流连接在一起,并且可以一键将其部署到其运行,..
网站防采集是一种常见的保护措施,用于防止恶意程序或自动化工具通过抓取网站上的数据。以下是一些常见的网站防采集方法:Robots.txt文件:通过在网站根目录下放置robots.txt文件,可以告诉搜索引擎爬虫或其他抓取工..
在.NET开发中处理高并发和大数据量的情况是一个关键的挑战。以下是一些我在这方面的经验和使用的工具:异步编程:使用异步编程模型(如async/await关键字)可以提高应用程序的并发性能。通过异步操作,可以释放主线..
CentOS7可以通过yum命令安装支持zip的工具unzip,下面是安装和使用的方法。安装unzip工具yuminstall-yunzipzip使用unzip命令解压zip文件#解压到当前目录下unziptest.zip#使用-d参数解压到指定目录下unzip-d/filestes..
程序员可以转行哪些职业?程序员失业后,可以考虑转行到以下领域:数据分析师:数据分析是一个快速发展的领域,需要掌握数据分析工具和编程技能。程序员已经具备了编程技能,可以通过学习数据分析工具(如Python和R..
编译一个Qt项目报错:Qt error: 找不到 -lGL这是因为 Qt编译器找不到 OpenGL 的动态链接库(libGL.so)。 在大部分 Linux 发行版中都是默认安装OpenGL,包括 Ubuntu、CentOS 等,找不到该链接库一般都是路径不对,如..
JS如何判断连续输入完?js判断输入结束可以通过下面这个jquery插件完美实现。引用js文件:http://www.leavescn.com/static/script/donetyping.js(未压缩前大小为3K)使用方法:$('#{你的input输入框的id}')..
前言在C# 5.0和.NET 4.5中,引入了基于await/async的异步编程模式,也称为“基于任务的异步编程模型 (TAP) ”。它有效地避免了异步任务回调嵌套的地狱,而且非常易于使用,但是深度理解它却比学会使用它要困难得多。..
在C#中,async/await 是处理异步操作的重要工具,它可以改善代码的可读性和性能。以下是一些async/await的最佳实践:1. 始终遵循命名规范对于异步方法,请使用以 "Async" 结尾的命名约定。这有助于识别异步方法并遵..
在.NET中,await关键字是用于异步编程的重要工具,它允许我们以同步的方式编写异步代码,从而提高代码的可读性和可维护性。本文将深入探讨.NET中await的工作原理,包括其背后的机制、如何影响代码执行流程,以及为何..
在 .NET C# 中,异步编程是一种常用的技术,可以提高应用程序的性能和响应能力。async/await 是 C# 中用于异步编程的关键字对。异步编程允许你编写更加高效的代码,特别是在需要等待 I/O 操作(如文件读写、网络请求..