AsyncAwait
using System;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks; namespace AsyncAwait
{
class Program
{
//http://www.cnblogs.com/sheng-jie/p/6471986.html
// 3.3. 什么是前台线程
// 默认情况下,使用Thread.Start()方法创建的线程都是前台线程。前台线程能阻止应用程序的终结,只有所有的前台线程执行完毕,CLR才能关闭应用程序(即卸载承载的应用程序域)。前台线程也属于工作者线程。 //3.4. 什么是后台线程
// 后台线程不会影响应用程序的终结,当所有前台线程执行完毕后,后台线程无论是否执行完毕,都会被终结。一般后台线程用来做些无关紧要的任务(比如邮箱每隔一段时间就去检查下邮件,天气应用每隔一段时间去更新天气)。后台线程也属于工作者线程。 static void Main(string[] args)
{ //C# async关键字用来指定某个方法、Lambda表达式或匿名方法自动以异步的方式来调用。
Console.WriteLine("主线程启动,当前线程为:" + Thread.CurrentThread.ManagedThreadId);
var task = GetLengthAsync(); Console.WriteLine("回到主线程,当前线程为:" + Thread.CurrentThread.ManagedThreadId); Console.WriteLine("线程【" + Thread.CurrentThread.ManagedThreadId + "】睡眠5s:");
Thread.Sleep(5000); //将主线程睡眠5s var timer = new Stopwatch();
timer.Start(); //开始计算时间 Console.WriteLine("task的返回值是" + task.Result); timer.Stop(); //结束点,另外StopWatch还有Reset方法,可以重置。
Console.WriteLine("等待了:" + timer.Elapsed.TotalSeconds + "秒");//显示时间 Console.WriteLine("主线程结束,当前线程为:" + Thread.CurrentThread.ManagedThreadId); //Console.WriteLine("主线程开始!"); //ForeBackGround();
//ThreadPoolTest();
Console.ReadKey();
} private static async Task<int> GetLengthAsync()
{
Console.WriteLine("GetLengthAsync()开始执行,当前线程为:" + Thread.CurrentThread.ManagedThreadId); var str = await GetStringAsync(); Console.WriteLine("GetLengthAsync()执行完毕,当前线程为:" + Thread.CurrentThread.ManagedThreadId); return str.Length;
} private static Task<string> GetStringAsync()
{
Console.WriteLine("GetStringAsync()开始执行,当前线程为:" + Thread.CurrentThread.ManagedThreadId);
return Task.Run(() =>
{
Console.WriteLine("异步任务开始执行,当前线程为:" + Thread.CurrentThread.ManagedThreadId); Console.WriteLine("线程【" + Thread.CurrentThread.ManagedThreadId + "】睡眠10s");
Thread.Sleep(10000); //将异步任务线程睡眠10s return "GetStringAsync()执行完毕"; }); } public static void TaskDemo2()
{
Console.WriteLine("主线程ID:" + Thread.CurrentThread.ManagedThreadId);
Task.Run(() => Console.WriteLine("Task对应线程ID:" + Thread.CurrentThread.ManagedThreadId));
Console.ReadLine();
} public static void TaskDemo()
{
Console.WriteLine("主线程ID:" + Thread.CurrentThread.ManagedThreadId); Task.Factory.StartNew(() => Console.WriteLine("Task对应线程ID:" + Thread.CurrentThread.ManagedThreadId));
Console.ReadKey();
} /// <summary>
/// ThreadPool(线程池)
/// </summary>
public static void ThreadPoolTest()
{
WaitCallback workItem = state => Console.WriteLine("当前线程Id为:" + Thread.CurrentThread.ManagedThreadId); for (int i = 0; i < 10; i++)
{
ThreadPool.QueueUserWorkItem(workItem);
} } /// <summary>
/// 前台线程、后台线程
/// </summary>
private static void ForeBackGround()
{
//创建前台工作线程
Thread t1 = new Thread(Task1);
t1.Start(); //创建后台工作线程
Thread t2 = new Thread(new ParameterizedThreadStart(Task2));
t2.IsBackground = true; //设置为后台线程
t2.Start("传参");
} private static void Task1()
{
Thread.Sleep(1000); //模拟耗时操作,睡眠1S
Console.WriteLine("前台线程被调用!");
} private static void Task2(object data)
{
Thread.Sleep(2000); //模拟耗时操作,睡眠2S
Console.WriteLine("后台线程被调用!" + data);
} }
}
using System;using System.Diagnostics;using System.Threading;using System.Threading.Tasks;
namespace AsyncAwait{ class Program { //http://www.cnblogs.com/sheng-jie/p/6471986.html // 3.3. 什么是前台线程 // 默认情况下,使用Thread.Start()方法创建的线程都是前台线程。前台线程能阻止应用程序的终结,只有所有的前台线程执行完毕,CLR才能关闭应用程序(即卸载承载的应用程序域)。前台线程也属于工作者线程。
//3.4. 什么是后台线程 // 后台线程不会影响应用程序的终结,当所有前台线程执行完毕后,后台线程无论是否执行完毕,都会被终结。一般后台线程用来做些无关紧要的任务(比如邮箱每隔一段时间就去检查下邮件,天气应用每隔一段时间去更新天气)。后台线程也属于工作者线程。
static void Main(string[] args) {
//C# async关键字用来指定某个方法、Lambda表达式或匿名方法自动以异步的方式来调用。 Console.WriteLine("主线程启动,当前线程为:" + Thread.CurrentThread.ManagedThreadId); var task = GetLengthAsync();
Console.WriteLine("回到主线程,当前线程为:" + Thread.CurrentThread.ManagedThreadId);
Console.WriteLine("线程【" + Thread.CurrentThread.ManagedThreadId + "】睡眠5s:"); Thread.Sleep(5000); //将主线程睡眠5s
var timer = new Stopwatch(); timer.Start(); //开始计算时间
Console.WriteLine("task的返回值是" + task.Result);
timer.Stop(); //结束点,另外StopWatch还有Reset方法,可以重置。 Console.WriteLine("等待了:" + timer.Elapsed.TotalSeconds + "秒");//显示时间
Console.WriteLine("主线程结束,当前线程为:" + Thread.CurrentThread.ManagedThreadId);
//Console.WriteLine("主线程开始!");
//ForeBackGround(); //ThreadPoolTest(); Console.ReadKey(); }
private static async Task<int> GetLengthAsync() { Console.WriteLine("GetLengthAsync()开始执行,当前线程为:" + Thread.CurrentThread.ManagedThreadId);
var str = await GetStringAsync();
Console.WriteLine("GetLengthAsync()执行完毕,当前线程为:" + Thread.CurrentThread.ManagedThreadId);
return str.Length; }
private static Task<string> GetStringAsync() { Console.WriteLine("GetStringAsync()开始执行,当前线程为:" + Thread.CurrentThread.ManagedThreadId); return Task.Run(() =>{ Console.WriteLine("异步任务开始执行,当前线程为:" + Thread.CurrentThread.ManagedThreadId);
Console.WriteLine("线程【" + Thread.CurrentThread.ManagedThreadId + "】睡眠10s"); Thread.Sleep(10000); //将异步任务线程睡眠10s
return "GetStringAsync()执行完毕";
});
}
public static void TaskDemo2() { Console.WriteLine("主线程ID:" + Thread.CurrentThread.ManagedThreadId); Task.Run(() => Console.WriteLine("Task对应线程ID:" + Thread.CurrentThread.ManagedThreadId)); Console.ReadLine(); }
public static void TaskDemo() { Console.WriteLine("主线程ID:" + Thread.CurrentThread.ManagedThreadId);
Task.Factory.StartNew(() => Console.WriteLine("Task对应线程ID:" + Thread.CurrentThread.ManagedThreadId)); Console.ReadKey(); }
/// <summary> /// ThreadPool(线程池) /// </summary> public static void ThreadPoolTest() { WaitCallback workItem = state => Console.WriteLine("当前线程Id为:" + Thread.CurrentThread.ManagedThreadId);
for (int i = 0; i < 10; i++) { ThreadPool.QueueUserWorkItem(workItem); }
}
/// <summary> /// 前台线程、后台线程 /// </summary> private static void ForeBackGround() { //创建前台工作线程 Thread t1 = new Thread(Task1); t1.Start();
//创建后台工作线程 Thread t2 = new Thread(new ParameterizedThreadStart(Task2)); t2.IsBackground = true; //设置为后台线程 t2.Start("传参"); }
private static void Task1() { Thread.Sleep(1000); //模拟耗时操作,睡眠1S Console.WriteLine("前台线程被调用!"); }
private static void Task2(object data) { Thread.Sleep(2000); //模拟耗时操作,睡眠2S Console.WriteLine("后台线程被调用!" + data); }
}}
AsyncAwait的更多相关文章
- NodeJs使用asyncAwait两法
async/await使用同步的方式来书写异步代码,将异步调用的难度降低到接近于0,未来必将大放异彩.然而在当下,由于标准化的缓存步伐,async/await尚在ES7的草案中.为了尝先,特试用了下面 ...
- Async Programming - 1 async-await 糖的本质(1)
这一个系列的文章主要来讲 C# 中的语言特性 async-await 在语言层面的本质,我们都知道 await 是编译器进行了一个 rewrite,然而这个 rewrite 并不是直接 rewrite ...
- 前端面试送命题(二)-callback,promise,generator,async-await
前言 本篇文章适合前端架构师,或者进阶的前端开发人员:我在面试vmware前端架构师的时候,被问到关于callback,promise,generator,async-await的问题. 首先我们回顾 ...
- Using async-await on .net 4
I'm currently starting to create an application that would profit a lot from C# 5's async-await feat ...
- 微信小程序中使用Async-await方法异步请求变为同步请求
微信小程序中有些 Api 是异步的,无法直接进行同步处理.例如:wx.request.wx.showToast.wx.showLoading等.如果需要同步处理,可以使用如下方法: 注意: Async ...
- ES6系列文章 异步神器async-await
关于异步处理,ES5的回调使我们陷入地狱,ES6的Promise使我们脱离魔障,终于.ES7的async-await带我们走向光明.今天就来学习一下 async-await. async-await和 ...
- 【原创】分布式之数据库和缓存双写一致性方案解析(三) 前端面试送命题(二)-callback,promise,generator,async-await JS的进阶技巧 前端面试送命题(一)-JS三座大山 Nodejs的运行原理-科普篇 优化设计提高sql类数据库的性能 简单理解token机制
[原创]分布式之数据库和缓存双写一致性方案解析(三) 正文 博主本来觉得,<分布式之数据库和缓存双写一致性方案解析>,一文已经十分清晰.然而这一两天,有人在微信上私聊我,觉得应该要采用 ...
- 原生JS中 callback,promise,generator,async-await 的简介
callback,promise,generator,async-await 的简介 javascript异步的发展历程. ES6 以前: 回调函数(callback):nodejs express ...
- 回调、Promise、async-await
第一章 异步:现在与将来 程序中现在运行的部分和将来运行的部分之间的关系就是异步编程的核心. 场景:等待用户输入.从数据库或文件系统中请求数据.通过网络 发送数据并等待响应,或者是在以固定时间间隔执行 ...
随机推荐
- jmeter登录之-动态参数
jmeter登录之-动态参数 1.抓包查看提交的登录参数 发现参数authenticity_token是动态的,每次都不一样,所以回放的时候就会失败 2.提取动态变化的参数-后置处理器(相当于LR的关 ...
- NGINX配置之一:日志篇
打开nginx.conf配置文件: vi /usr/local/nginx/conf/nginx.conf 日志部分内容: 日志生成的到Nginx根目录logs/access.log文件,默认使用“m ...
- LintCode 汉诺塔
题目链接:https://www.lintcode.com/problem/tower-of-hanoi/description 题目大意 经典递归问题. 分析 由于是经典问题了,这里不讨论用递归实现 ...
- GIT 学习第二天 (二)
工作区和暂存区 工作区: 就是你在电脑里能看到的目录,比如:webgit 文件夹 就是一个工作区 版本库: 工作区有一个隐藏目录 .git ,这个不算工作区,而是Git的版本库 Git的版本库里存了很 ...
- Django框架(五)—— 虚拟环境搭建
目录 Django虚拟环境搭建 Django虚拟环境搭建 一.为什么要用虚拟环境 公司以前开发的项目是在Django1.5的基础上开发的,先要需要基于Django2.0开发一套项目.这样不能卸载原有版 ...
- Day 21 python :面向对象 类的相关内置函数 /单例模式 /描述符
1.isinstance(obj,cls) 检查obj是否是类cls的对象: 备注:用isinstance 的时候,产生实例后,会显示实例既是父类的实例,也是子类的实例 class Mom: gend ...
- 10 个轻松学会 CSS3 的优秀在线资源
本文包揽 CSS 的所有关键点,并且引入了最新的 CSS3 版本.这个先进的技术提供超级多的新标签和属性,使得 Web 设计构建创新更简单,帮助开发者创建具有新趋势,带有漂亮布局的 Web 页面.随着 ...
- laydate box-sizingCSS就会变形
*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;/* box-sizing:border-box; */} 解决:在/laydat ...
- 46-Ubuntu-系统信息-1-date和cal查看系统时间
序号 命令 作用 01 date 查看系统时间 02 cal calendar查看日历,-y选项可以查看一年的日历
- RMQ 模板题 poj 3264
题目:点这里 题意:给一个长度n的数列,然后又Q个询问,问L 到R 中最大值与最小值的差. 分析:RMQ 的模板题. 代码: #include<stdio.h> #include& ...