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的更多相关文章

  1. NodeJs使用asyncAwait两法

    async/await使用同步的方式来书写异步代码,将异步调用的难度降低到接近于0,未来必将大放异彩.然而在当下,由于标准化的缓存步伐,async/await尚在ES7的草案中.为了尝先,特试用了下面 ...

  2. Async Programming - 1 async-await 糖的本质(1)

    这一个系列的文章主要来讲 C# 中的语言特性 async-await 在语言层面的本质,我们都知道 await 是编译器进行了一个 rewrite,然而这个 rewrite 并不是直接 rewrite ...

  3. 前端面试送命题(二)-callback,promise,generator,async-await

    前言 本篇文章适合前端架构师,或者进阶的前端开发人员:我在面试vmware前端架构师的时候,被问到关于callback,promise,generator,async-await的问题. 首先我们回顾 ...

  4. 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 ...

  5. 微信小程序中使用Async-await方法异步请求变为同步请求

    微信小程序中有些 Api 是异步的,无法直接进行同步处理.例如:wx.request.wx.showToast.wx.showLoading等.如果需要同步处理,可以使用如下方法: 注意: Async ...

  6. ES6系列文章 异步神器async-await

    关于异步处理,ES5的回调使我们陷入地狱,ES6的Promise使我们脱离魔障,终于.ES7的async-await带我们走向光明.今天就来学习一下 async-await. async-await和 ...

  7. 【原创】分布式之数据库和缓存双写一致性方案解析(三) 前端面试送命题(二)-callback,promise,generator,async-await JS的进阶技巧 前端面试送命题(一)-JS三座大山 Nodejs的运行原理-科普篇 优化设计提高sql类数据库的性能 简单理解token机制

    [原创]分布式之数据库和缓存双写一致性方案解析(三)   正文 博主本来觉得,<分布式之数据库和缓存双写一致性方案解析>,一文已经十分清晰.然而这一两天,有人在微信上私聊我,觉得应该要采用 ...

  8. 原生JS中 callback,promise,generator,async-await 的简介

    callback,promise,generator,async-await 的简介 javascript异步的发展历程. ES6 以前: 回调函数(callback):nodejs express ...

  9. 回调、Promise、async-await

    第一章 异步:现在与将来 程序中现在运行的部分和将来运行的部分之间的关系就是异步编程的核心. 场景:等待用户输入.从数据库或文件系统中请求数据.通过网络 发送数据并等待响应,或者是在以固定时间间隔执行 ...

随机推荐

  1. Shiro学习(9)JSP标签

    Shiro提供了JSTL标签用于在JSP/GSP页面进行权限控制,如根据登录用户显示相应的页面按钮. 导入标签库 Java代码   <%@taglib prefix="shiro&qu ...

  2. java在acm中常用基础技巧方法

    java在acm中常用基础技巧方法 如果学到了新的技巧,本博客会更新~ input input-std @Frosero import java.util.*; public class Main { ...

  3. python内置模块-json和pickle

    安装第三方库     pip3 install requests     源码安装:下载源码,解压后切换到当前目录     执行python setup.py install   json和pickl ...

  4. CSS:CSS Id 和 Class选择器

    ylbtech-CSS:CSS Id 和 Class选择器 1.返回顶部 1. CSS Id 和 Class id 和 class 选择器 如果你要在HTML元素中设置CSS样式,你需要在元素中设置& ...

  5. [经典]Python 一篇学会多线程

    对于python 多线程的理解,我花了很长时间,搜索的大部份文章都不够通俗易懂.所以,这里力图用简单的例子,让你对多线程有个初步的认识. 单线程 在好些年前的MS-DOS时代,操作系统处理问题都是单任 ...

  6. Git 学习第一天

    本文是根据廖雪峰老师的git教程记录的学习笔记,特此说明,原教程链接https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c ...

  7. 剑指offer——71扑克牌中的顺子

    题目描述 LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决 ...

  8. Django框架(十)—— 多表操作:一对一、一对多、多对多的增删改,基于对象/双下划线的跨表查询、聚合查询、分组查询、F查询与Q查询

    目录 多表操作:增删改,基于对象/双下划线的跨表查询.聚合查询.分组查询.F查询与Q查询 一.创建多表模型 二.一对多增删改表记录 1.一对多添加记录 2.一对多删除记录 3.一对多修改记录 三.一对 ...

  9. Rsync 恢复 libselinux.SO.1

    libselinux.SO.1  这个文件对 CentOS 7很重要, 误删掉后,会导致很多命令无法使用(比如yum ,rpm  命令),利用rsync这个工具来修复. 服务端执行如下配置:(选取正常 ...

  10. Straight Master (贪心)

    题目如下:A straight is a poker hand containing five cards of sequential rank, not necessarily to be the ...