static void Main(string[] args)
{
Test(); // 这个方法其实是多余的, 本来可以直接写下面的方法
// await GetName()
// 但是由于控制台的入口方法不支持async,所有我们在入口方法里面不能 用 await Console.WriteLine("Current2 Thread Id :{0}", Thread.CurrentThread.ManagedThreadId);
Console.ReadKey();
} static async Task Test()
{
// 方法打上async关键字,就可以用await调用同样打上async的方法
// await 后面的方法将在另外一个线程中执行
await GetName();
} static async Task GetName()
{
// Delay 方法来自于.net 4.5
Console.WriteLine("Current Thread Id :{0}", Thread.CurrentThread.ManagedThreadId);
//await Task.Delay(1000); // 返回值前面加 async 之后,方法里面就可以用await了
var a= Task<string>.Run(() => {
Console.WriteLine("Current3 Thread Id :{0}", Thread.CurrentThread.ManagedThreadId);
Thread.Sleep();
return "abc";
});
Console.WriteLine("Current5 Thread Id :{0}", Thread.CurrentThread.ManagedThreadId);
var b = Task<string>.Run(() =>
{
Console.WriteLine("Current4 Thread Id :{0}", Thread.CurrentThread.ManagedThreadId);
Thread.Sleep();
return "abc";
});
await a;
Console.WriteLine("Current6 Thread Id :{0}", Thread.CurrentThread.ManagedThreadId);
await b;
Console.WriteLine("Current1 Thread Id :{0}", Thread.CurrentThread.ManagedThreadId);
Console.WriteLine("In antoher thread.....");
}

发现一旦await等待的结果没有还未返回,await后续的代码就会被扔给所等待的线程执行

根据测试,async函数内遇到await且所等待的Task未返回应该采用的不是返回机制,而是直接从栈上跳出整个函数了,并把后续代码扔给了所等待Task线程操作。

这是怎么实现的呢?

根据我写C的经验单纯写C来实现这一套机制好像不现实了。应该是汇编操作地址了。

如果对这个机制基本使用不了解的,可以看这文章了解或者回顾下

async & await 的前世今生(Updated)

最近使用C++ std::async发现于此不同。std::async返回std::future。在future对象消亡前必然会强制保证Task执行完毕,类似于自动调用了future.wait() or get()。而且没有C#的将await之后的代码交付异步线程运行的效果

对C# .Net4.5异步机制测试的更多相关文章

  1. 对C# .Net4.5异步机制测试(二)——加深印象

    public static void Main() { Console.WriteLine(Thread.CurrentThread.ManagedThreadId); In(); Console.W ...

  2. JavaScript的异步机制

    我们经常说JS是单线程的,比如node.js研讨会上大家都说JS的特色之一是单线程的,这样使JS更简单明了,可是大家真的理解所谓JS的单线程机制吗?单线程时,基于事件的异步机制又该当如何 1 先看下两 ...

  3. AngularJS 的异步服务测试与Mocking

    测试 AngularJS 的异步服务 最近,在做项目时掉进了 AngularJS 异步调用 $q 测试的坑中,直接躺枪了.折腾了许久日子,终于想通了其中的道道,但并不确定是最佳的解决方案,最后还是决定 ...

  4. Js异步机制的实现

    Js异步机制 JavaScript是一门单线程语言,所谓单线程,就是指一次只能完成一件任务,如果有多个任务,就必须排队,前面一个任务完成,再执行后面一个任务,以此类推.这种模式的好处是实现起来比较简单 ...

  5. 结合源码看nginx-1.4.0之nginx异步机制详解

    目录 0. 摘要 1. nginx异步设计思想 2. nginx异步设计数据结构 3. nginx异步机制源码解析 4. 一个简单的应用异步例子 5. 小结 6. 参考源码

  6. JavaScript单线程和异步机制

    随着对JavaScript学习的深入和实践经验的积累,一些原理和底层的东西也开始逐渐了解.早先也看过一些关于js单线程和事件循环的文章,不过当时看的似懂非懂,只留了一个大概的印象:浏览器中的js程序时 ...

  7. 深入理解Spring的异步机制

    一.Spring中实现异步执行 在这里我先以事件的机制举例,注意默认情况下事件的发布与监听都是同步执行的.那么我们来看一看基于异步事件的例子该怎么写 首先还是定义事件: package com.bdq ...

  8. [转]JavaScript异步机制详解

    原文: https://www.jianshu.com/p/4ea4ee713ead --------------------------------------------------------- ...

  9. Windows store app[Part 4]:深入WinRT的异步机制

    接上篇Windows store app[Part 3]:认识WinRT的异步机制 WinRT异步机制回顾: IAsyncInfo接口:WinRT下异步功能的核心,该接口提供所有异步操作的基本功能,如 ...

随机推荐

  1. varnish4 配置文件整理

    vim default.vcl # 使用varnish版本4的格式. vcl 4.0; # 加载后端轮询模块 import directors; #######################健康检查 ...

  2. Java HashMap的put操作(Java1.6)

    https://www.cnblogs.com/skywang12345/p/3310835.html // 存储数据的Entry数组,长度是2的幂. // HashMap是采用拉链法实现的,每一个E ...

  3. Delphi 限制Edit输入 多个例子

    procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char); begin if not (key in [ '.',#8]) then ...

  4. How to create DMG on macOS

    hdiutil create -srcfolder /users/test1/ -volname test1 /users/test/test1.dmg

  5. HttpWebRequest using Basic authentication

    System.Net.CredentialCache credentialCache = new System.Net.CredentialCache(); credentialCache.Add( ...

  6. 【算法】串的模式匹配算法(KMP)

    串的模式匹配算法     问题:         求子串位置的定位函数如何写? int index(SString S,SString T,int pos);         给定串S,子串T,问T在 ...

  7. 关于Binder,作为应用开发者你需要知道的全部

    作者:rushjs https://www.jianshu.com/p/062a6e4f5cbe github 地址: https://github.com/rushgit/zhongwenjun.g ...

  8. hadoop安装要领

    1.安装JDK tar -zxvf jdk-7u75-linux-i586.tar.gz -C /root/training/ vi ~/.bash_profile JAVA_HOME=/root/t ...

  9. 为什么开启子进程 一定要放在 if __name__ == '__main__' 下面

  10. 手机Web 开发中图片img 如何等比例缩放

    如果图片本身没有设置 width.height属性的话,只需要修改 max-width:100%; 就可以了 如果图片本身设置了 width.height属性的话,需要同时修改width 和heigh ...