对C# .Net4.5异步机制测试
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异步机制测试的更多相关文章
- 对C# .Net4.5异步机制测试(二)——加深印象
public static void Main() { Console.WriteLine(Thread.CurrentThread.ManagedThreadId); In(); Console.W ...
- JavaScript的异步机制
我们经常说JS是单线程的,比如node.js研讨会上大家都说JS的特色之一是单线程的,这样使JS更简单明了,可是大家真的理解所谓JS的单线程机制吗?单线程时,基于事件的异步机制又该当如何 1 先看下两 ...
- AngularJS 的异步服务测试与Mocking
测试 AngularJS 的异步服务 最近,在做项目时掉进了 AngularJS 异步调用 $q 测试的坑中,直接躺枪了.折腾了许久日子,终于想通了其中的道道,但并不确定是最佳的解决方案,最后还是决定 ...
- Js异步机制的实现
Js异步机制 JavaScript是一门单线程语言,所谓单线程,就是指一次只能完成一件任务,如果有多个任务,就必须排队,前面一个任务完成,再执行后面一个任务,以此类推.这种模式的好处是实现起来比较简单 ...
- 结合源码看nginx-1.4.0之nginx异步机制详解
目录 0. 摘要 1. nginx异步设计思想 2. nginx异步设计数据结构 3. nginx异步机制源码解析 4. 一个简单的应用异步例子 5. 小结 6. 参考源码
- JavaScript单线程和异步机制
随着对JavaScript学习的深入和实践经验的积累,一些原理和底层的东西也开始逐渐了解.早先也看过一些关于js单线程和事件循环的文章,不过当时看的似懂非懂,只留了一个大概的印象:浏览器中的js程序时 ...
- 深入理解Spring的异步机制
一.Spring中实现异步执行 在这里我先以事件的机制举例,注意默认情况下事件的发布与监听都是同步执行的.那么我们来看一看基于异步事件的例子该怎么写 首先还是定义事件: package com.bdq ...
- [转]JavaScript异步机制详解
原文: https://www.jianshu.com/p/4ea4ee713ead --------------------------------------------------------- ...
- Windows store app[Part 4]:深入WinRT的异步机制
接上篇Windows store app[Part 3]:认识WinRT的异步机制 WinRT异步机制回顾: IAsyncInfo接口:WinRT下异步功能的核心,该接口提供所有异步操作的基本功能,如 ...
随机推荐
- k8s使用glusterfs做存储
一.安装glusterfs https://www.cnblogs.com/zhangb8042/p/7801181.html 环境介绍; centos 7 [root@k8s-m ~]# cat / ...
- linux中一些特殊的中文文件不能删除问题
例: [root@iZ2zecl4i8oy1rvs00dqzeZ tmp]# ,),(,,' [root@iZ2zecl4i8oy1rvs00dqzeZ tmp]# echo "rm -rf ...
- 相识mongodb
1.下载完安装包,并解压下载地址:https://www.mongodb.org/dl/linux/x86_64或者可以直接wget http://fastdl.mongodb.org/linux/m ...
- Delphi之TComponent类
TComponent类 TComponent类直接由TPersistent派生.TComponent的独特特征是它的属性能够在设计期间通过ObjectInspector来控制,能够拥有其他组件.非可视 ...
- SQL 添加索引
使用CREATE 语句创建索引 CREATE INDEX index_name ON table_name(column_name,column_name) include(score) 普通索引 C ...
- centos7优化启动项,关闭一些不必要开启的服务
CentOS7已不再使用chkconfig 管理启动项 使用 systemctl list-unit-files 可以查看启动项 systemctl list-unit-files | grep en ...
- codeforces659C
Tanya and Toys CodeForces - 659C In Berland recently a new collection of toys went on sale. This col ...
- 洛谷 P3953 逛公园
题目链接 思路 首先没有0边,且k为0的情况就是最短路计数. 如果k不为0,看到k<=50,想到dp. 设f[u][i]表示到达u点比最短路多走i的路径数,转移到v点. f[u][i]+=f[v ...
- 【HDU - 4340】Capturing a country(树形DP)
BUPT2017 wintertraining(15) #8A 题意 n(<100)个城市组成的树.A攻击i城市需要a[i]代价,B需要b[i].如果一个城市的邻居被A攻击了,那么A攻击它只要A ...
- 字符串数据结构模板/题单(后缀数组,后缀自动机,LCP,后缀平衡树,回文自动机)
模板 后缀数组 #include<bits/stdc++.h> #define R register int using namespace std; const int N=1e6+9; ...