Async/Await执行顺序问题

问题描述

privatevoidNN(){Test();Console.WriteLine("NN");}asyncvoidTest(){awaitLoadData();Console.WriteLine("Test");}asyncTask<string>LoadData(){returnawaitTask.Run(()=>{Task.Delay(6000).Wait();Console.WriteLine("LoadDataIn");return"";});}

执行结果:NNLoadDataInTest

跟我想象的不一样为什么调用Test()方法后,不等待Test()方法执行完成,就继续向下执行了?

解决方案

解决方案二:
该回复于2015-11-24 16:14:05被版主删除
解决方案三:
是await内部会等待,改成下面的就等待了privateasyncstaticvoidNN(){awaitTest();Console.WriteLine("NN");}staticasyncTaskTest(){vard=awaitLoadData();Console.WriteLine(d);Console.WriteLine("Test");}staticasyncTask<string>LoadData(){returnawaitTask.Run(()=>{Task.Delay(6000).Wait();Console.WriteLine("LoadDataIn");return"LoadData";});}

解决方案四:
或者你把privateasyncstaticvoidNN(){awaitTest();Console.WriteLine("NN");}

改成privatestaticvoidNN(){Test();Console.WriteLine("NN");}

这时候VS会给你提示的
解决方案五:
引用2楼starfd的回复:

是await内部会等待,改成下面的就等待了privateasyncstaticvoidNN(){awaitTest();Console.WriteLine("NN");}staticasyncTaskTest(){vard=awaitLoadData();Console.WriteLine(d);Console.WriteLine("Test");}staticasyncTask<string>LoadData(){returnawaitTask.Run(()=>{Task.Delay(6000).Wait();Console.WriteLine("LoadDataIn");return"LoadData";});}

是不是同步调用Test(),如果里面没有await关键字,这个方法就同步执行;如果vard=awaitLoadData();之前还有部分同步代码,前面的依旧是同步执行,在vard=awaitLoadData();这里马上就变成异步执行了,此时调用Test();后面的代码(Console.WriteLine("NN");)也立马可以执行了感觉好像是await的Task及之后的代码整体上全部是异步执行了(awaitTest();Console.WriteLine("NN");),而不是我想的整个方法里面一次顺序执行.请问,大概是这样吗?
解决方案六:
await内部是一次执行,但因为你的声明asyncvoidTest(),所以在调用Test方法时,这里不会等待,内部有await关键字,那段会进行等待

时间: 2024-11-05 21:49:39

Async/Await执行顺序问题的相关文章

如何在现有代码中通过async/await实现并行

一项新技术或者一个新特性,只有你用它解决实际问题后,才能真正体会到它的魅力,真正理解它.也期待大家能够多分享解一些解决实际问题的内容. 在我们遭遇"黑色30秒"问题的过程中,切身体会到了异步的巨大作用(详见从ASP.NET线程角度对"黑色30秒"问题的全新分析),于是开始逐步地用async/await改造现有代码. 今天早上在将一个MVC Controller中的Action改为异步的时候突然发现--其中有7个方法调用可以并行执行. public async Tas

async &amp; await 的前世今生

原文:async & await 的前世今生   async 和 await 出现在C# 5.0之后,给并行编程带来了不少的方便,特别是当在MVC中的Action也变成async之后,有点开始什么都是async的味道了.但是这也给我们编程埋下了一些隐患,有时候可能会产生一些我们自己都不知道怎么产生的Bug,特别是如果连线程基础没有理解的情况下,更不知道如何去处理了.那今天我们就来好好看看这两兄弟和他们的叔叔(Task)爷爷(Thread)们到底有什么区别和特点,本文将会对Thread 到 Tas

async &amp; await 的前世今生(Updated)

原文:async & await 的前世今生(Updated) async 和 await 出现在C# 5.0之后,给并行编程带来了不少的方便,特别是当在MVC中的Action也变成async之后,有点开始什么都是async的味道了.但是这也给我们编程埋下了一些隐患,有时候可能会产生一些我们自己都不知道怎么产生的Bug,特别是如果连线程基础没有理解的情况下,更不知道如何去处理了.那今天我们就来好好看看这两兄弟和他们的叔叔(Task)爷爷(Thread)们到底有什么区别和特点,本文将会对Threa

理解JavaScript的async/await

随着 Node 7 的发布,越来越多的人开始研究据说是异步编程终级解决方案的 async/await.我第一次看到这组关键字并不是在 JavaScript 语言里,而是在 c# 5.0 的语法中.C# 的 async/await 需要在 .NET Framework 4.5 以上的版本中使用,因此我还很悲伤了一阵--为了要兼容 XP 系统,我们开发的软件不能使用高于 4.0 版本的 .NET Framework. 我之前在<闲谈异步调用"扁平"化> 中就谈到了这个问题.无论

Async/Await替代Promise的6个理由

译者按: Node.js的异步编程方式有效提高了应用性能;然而回调地狱却让人望而生畏,Promise让我们告别回调函数,写出更优雅的异步代码;在实践过程中,却发现Promise并不完美;技术进步是无止境的,这时,我们有了Async/Await. Node.js 7.6已经支持async/await了,如果你还没有试过,这篇博客将告诉你为什么要用它. Async/Await简介 对于从未听说过async/await的朋友,下面是简介: async/await是写异步代码的新方式,以前的方法有回调函

async / await:更好的异步解决方案

在实际开发中总会遇到许多异步的问题,最常见的场景接口请求之后一定要等一段时间才能得到结果,如果遇到多个接口前后依赖,那么问题就变得复杂.大家都一直在尝试使用更好的方案来解决这些问题.最开始只能利用回调函数,后来开始有人使用Promise的思维来搞定.到ES6中开始支持原生的Promise,引入Generator函数. 直到ES7,有了async/await. 这是一个用同步的思维来解决异步问题的方案. 我想很多人可能还不太分得清同步与异步的区别.如果你已经彻底了解了事件循环,那么想必对异步的概念

C# async/await 使用总结

今天搞这两个关键字搞得有点晕,主要还是没有彻底理解其中的原理.   混淆了一个调用异步方法的概念: 在调用异步方法时,虽然方法返回一个 Task,但是其中的代码已经开始执行.该方法在调用时,即刻执行了一部分代码,直接最底层的 Async API 处才产生真正的异步操作,这时向上逐步返回,并最终使用一个 Task 来代表该异步任务. 当不使用 await 关键字时,该异步方法同样在异步执行.而使用 await 关键字后,只不过是对 Task(awaitable) 对象异步等待其执行结束,然后再同上

JavaScript 的 Async/Await 完胜 Promise 的六个理由

提醒一下各位,Node 现在从版本 7.6 开始就支持 async/await 了.如果你还没有试过它,这里有一堆带有示例的理由来说明为什么你应该马上采用它,并且再也不会回头. 貌似嵌入 gist 上的代码在 medium 原生 app 中不行,但是在移动浏览器上可以.如果你是在 app 中读本文,请点击共享图标,选择"在浏览器中打开",才看得到代码片段. Async/await 101 对于那些从未听说过这个话题的人来说,如下是一个简单的介绍: Async/await 是一种编写异步

asp-我想请教一下,ASP, JS的执行顺序

问题描述 我想请教一下,ASP, JS的执行顺序 <html> <head> 引入JQ 略 <script> $.ajax({ url : "temp.asp", data:{"w":screen.width},// temp.asp页面中,将接收到的值写入session("w") cache : false, async : false,//同步 type : "get", dataTyp