结论:

(1)asyc方法的返回类型必须为:void、Task或者Task<T>。返回类型为Task的异步方法中无需使用return返回值,而返回类型为Task<TResult>的异步方法中必须使用return返回一个Tresult类型的值。

(2)await必须用来修饰Task或Task<TResult>(方法和对象),且只能出现在已经用async关键字修饰的异步方法中。

(3)在async标识的方法体里面,在await关键字出现之前,是由原线程顺序调用的,运行到await处就会调整执行顺序:await语句仍旧由原线程执行,直到遇到一个Task后新建一个线程执行Task任务。此时原线程将跳出async函数并执行其后代码;await语句的下一条语句至async函数结束之间的语句会被挂起,由新建的Task线程在跳出await语句后继续执行。await关键字本质上是是用于返回值是“可等待”类型(awaitable)的方法。

代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading; namespace TestConsole
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("线程ID:" + Thread.CurrentThread.ManagedThreadId + " -------主线程启动-------");
Task<int> task = OuterAsync();
Thread.Sleep();
Console.WriteLine("线程ID:" + Thread.CurrentThread.ManagedThreadId + " 主线程继续运行...");
Console.WriteLine("线程ID:" + Thread.CurrentThread.ManagedThreadId + " -------主线程结束-------"); Console.ReadLine();
} static async Task<int> OuterAsync()
{
Console.WriteLine("线程ID:" + Thread.CurrentThread.ManagedThreadId + " OuterAsync() Start"); string str = await TaskAsync();
Console.WriteLine("线程ID:" + Thread.CurrentThread.ManagedThreadId + " OuterAsync() End");
return str.Length;
} static Task<string> TaskAsync()
{
Console.WriteLine("线程ID:" + Thread.CurrentThread.ManagedThreadId + " TaskAsync() Start"); var result = Task<string>.Run(() =>
{
Thread.Sleep();
Console.WriteLine("线程ID:" + Thread.CurrentThread.ManagedThreadId + " Task Running...");
return "finished";
});
Console.WriteLine("线程ID:" + Thread.CurrentThread.ManagedThreadId + " TaskAsync() End");
return result;
}
}
}

分析:

async和await学习笔记的更多相关文章

  1. C# async await 学习笔记2

    C# async await 学习笔记1(http://www.cnblogs.com/siso/p/3691059.html) 提到了ThreadId是一样的,突然想到在WinForm中,非UI线程 ...

  2. promise以及async、await学习总结

    Promise/async.await帮我们解决了什么 它给我们提供了一种新的异步编程解决方案,同时避免了困扰已久的回调地狱 // 异步的处理可能会产生这样的回调地狱(第二个异步操作和第一个异步的结果 ...

  3. C# async await 学习笔记1

    由于我的开发工具为vs.net 2010(.net 4.0),需先做以下两步才能进行: 1.下载并安装Async CTP (http://www.microsoft.com/en-us/downloa ...

  4. async/await学习笔记

    async/await 的目的是简化使用 promises 的写法.     让我们来看看下面的例子: // 一个标准的 JavaScript 函数 function getNumber1() { r ...

  5. C#同步,异步的理解,包括5.0中await和async(学习笔记)

    之前在工作中一直用的是同步线程,就是先进入画面的load事件,然后在里面进行数据库调用的处理.后面又遇到了公司软件中一些比较古老的代码,一开始在那块古老代码中增加机能的时候,我想用到数据库的数据给画面 ...

  6. 多线程编程学习笔记——async和await(一)

    接上文 多线程编程学习笔记——任务并行库(一) 接上文 多线程编程学习笔记——任务并行库(二) 接上文 多线程编程学习笔记——任务并行库(三) 接上文 多线程编程学习笔记——任务并行库(四) 通过前面 ...

  7. 多线程编程学习笔记——async和await(二)

    接上文 多线程编程学习笔记——async和await(一) 三.   对连续的异步任务使用await操作符 本示例学习如何阅读有多个await方法方法时,程序的实际流程是怎么样的,理解await的异步 ...

  8. 多线程编程学习笔记——async和await(三)

    接上文 多线程编程学习笔记——async和await(一) 接上文 多线程编程学习笔记——async和await(二) 五.   处理异步操作中的异常 本示例学习如何在异步函数中处理异常,学习如何对多 ...

  9. C#线程学习笔记九:async & await入门二

    一.异步方法返回类型 只能返回3种类型(void.Task和Task<T>). 1.1.void返回类型:调用方法执行异步方法,但又不需要做进一步的交互. class Program { ...

随机推荐

  1. Android------------------的快捷键的使用

    https://www.cnblogs.com/shidian/p/6937630.html

  2. KVM虚拟机配置

    KVM 全称是 Kernel-Based Virtual Machine.也就是说 KVM 是基于 Linux 内核实现的,KVM有一个内核模块叫 kvm.ko,只用于管理虚拟 CPU 和内存. 在 ...

  3. Linux学习笔记-基本操作4

    1. gdb调试2. makefile的编写3. 系统IO函数 1. gdb调试:        1. 启动gdb + 可执行文件        2. 查看代码:                l== ...

  4. 不一样的日期、时间转换(moment.js)

    无意中遇到了一种很奇怪的日期格式,从接口中返回的日期是这样的,如 2018-02-06T11:59:22+08:00 .然而这却不是我们想要的,我们要的是这种,YYYY-MM-DD HH:mm:ss. ...

  5. D3.js (v3)+react框架 基础部分之认识选择集和如何绘制一个矢量图

    首先需要下载安装d3.js  :  yarn add d3 然后在组建中引入 :  import * as d3 from 'd3' 然后定义一个方法,在componentDidMount()这个钩子 ...

  6. Ubuntu14.04 + Text-Detection-with-FRCN(CPU)

    操作系统: yt@yt-MS-:~$ cat /etc/issue Ubuntu LTS \n \l Python版本: yt@yt-MS-:~$ python --version Python pi ...

  7. POJ 2719

    #include<iostream> #include<stdio.h> using namespace std; ]; int _pow(int m,int n); int ...

  8. rpm安装JDK方法

    由于版权原因,Linux发行版并没有包含官方版的Oracle JDK,必须自己从官网上下载安装.Oracle官网用Cookie限制下载方式,使得眼下只能用浏览器进行下载,使用其他方式可能会导致下载失败 ...

  9. 网络Socket编程TCP协议例子

    1.单线程TCP服务端 public class TcpChatServer { private Integer port=8000; private ServerSocket serverSocke ...

  10. tensorflow进阶篇-5(反向传播1)

    这里将讲解tensorflow是如何通过计算图来更新变量和最小化损失函数来反向传播误差的:这步将通过声明优化函数来实现.一旦声明好优化函数,tensorflow将通过它在所有的计算图中解决反向传播的项 ...