async/await成对匹配,不是一个死循环吗?

问题描述

async/await成对匹配,不是一个死循环吗?

要在async修饰的方法体里面使用await,被await的方法需要用async修饰、而且里面必须要有await。
这样一层一层递推下去,最后似乎必须await到一个内置的耗时方法上去,否则就没法结束。这究竟是怎么回事???
麻烦熟悉的师兄师姐们指点迷津。

举例(简化):

 async void DoWork1()
 {//...
        await DoWork11();
 }

 async Task DoWork11()
 {//...
        await DoWork111();
 }

 async Task DoWork111() //不用 async修饰就会提示“并非所有的代码路径都返回值”
 {//...
        await DoWork1111();  //如果方法用async修饰而此处不用await修饰就会提示“此异步方法缺少await运算符,将同步运行”,而且好多方法不能await,彻底晕了...
 }

解决方案

         async void foo()
        {
            int x = await MyAsync(1, 2);
            Console.WriteLine(x);
        }

        void bar()
        {
            var aw = MyAsync(1, 2).GetAwaiter();
            aw.OnCompleted(() => { Console.WriteLine(aw.GetResult()); });
        }

        Task<int> MyAsync(int x, int y)
        {
            return new Task<int>(() => x + y);
        }

解决方案二:

async Task DoWork111()
不用async也可以,注意,返回的是Task。
await/async只是语法糖。

解决方案三:

比如如上代码,你可以看到,你完全可以不用async/await

        async Task<int> MyAsync(int x, int y)
        {
            return x + y;
        }

这些都是等价的。

解决方案四:

修正下

         Task<int> MyAsync(int x, int y)
        {
            var tf = new TaskFactory<int>();
            return tf.StartNew(() => x + y);
        }

解决方案五:

await就是等待async的异步返回。不然你不处理返回也可以啊。

解决方案六:

async修饰方法必须用await,很奇怪的规定,你说的是Java吗?
如果是,绝对不是必须,而是有需求才用。

时间: 2024-08-03 21:21:46

async/await成对匹配,不是一个死循环吗?的相关文章

Node.js7/8中的async/await用法详解

Node.js 7 night中引入了async/await用法,但是在Node.js 8和Javascript V8才可能正式激活async/await函数. 什么是async/await?以前使用Promise是如何实现异步操作的,下面案例是展示如何使用Promise和Fetch API抓取数据的: function getTrace () {    return fetch('https://www.jdon.com', {     method: 'get'   }) } getTrac

async &amp; await 的前世今生

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

Python协程:从yield/send到async/await

这个文章理好了脉落. http://python.jobbole.com/86069/ 我练 习了一番,感受好了很多... Python由于众所周知的GIL的原因,导致其线程无法发挥多核的并行计算能力(当然,后来有了multiprocessing,可以实现多进程并行),显得比较鸡肋.既然在GIL之下,同一时刻只能有一个线程在运行,那么对于CPU密集的程序来说,线程之间的切换开销就成了拖累,而以I/O为瓶颈的程序正是协程所擅长的: 多任务并发(非并行),每个任务在合适的时候挂起(发起I/O)和恢复

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实现并行

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

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) 对象异步等待其执行结束,然后再同上