.Net进阶系列(14)-异步多线程(async和await)(被替换)
1. 方法名前只有async,但是方法中Task实例前没有await关键字,该方法和普通方法没有什么区别,但是会报一个警告。
#region 情况一
/// <summary>
/// 当只有async,没有await时,方法会有个警告
/// 和普通的多线程方法没有什么区别
/// </summary>
private static async void Test1()
{
//主线程执行
Console.WriteLine("主线程{0}开始:", Thread.CurrentThread.ManagedThreadId);
//启动新线程完成任务
Task task = Task.Run(() =>
{
Console.WriteLine("子线程{0}开始:", Thread.CurrentThread.ManagedThreadId);
Thread.Sleep();
Console.WriteLine("子线程{0}结束:", Thread.CurrentThread.ManagedThreadId);
});
//主线程执行
Console.WriteLine("主线程{0}结束:", Thread.CurrentThread.ManagedThreadId);
}
#endregion
结果:

2. 用法:方法名前加async,如果方法无返回值,用async Task 代替async void ,await放到Task实例前面,表示执行完Task线程后,方可执行后面的操作。
#region 情况三
/// <summary>
/// 无返回值 async Task == async void
/// Task和Task<T>能够使用await, Task.WhenAny, Task.WhenAll等方式组合使用,async Void 不行
/// </summary>
private static async Task Test3()
{
//主线程执行
Console.WriteLine("主线程{0}开始:", Thread.CurrentThread.ManagedThreadId);
//启动新线程完成任务
Task task = Task.Run(() =>
{
Console.WriteLine("子线程{0}开始:", Thread.CurrentThread.ManagedThreadId);
Thread.Sleep();
Console.WriteLine("子线程{0}结束:", Thread.CurrentThread.ManagedThreadId);
});
await task; //等待子线程执行完毕,方可执行后面的语句
Console.WriteLine("主线程{0}结束:", Thread.CurrentThread.ManagedThreadId);
}
#endregion
结果:

3.带返回值的Task,要使用返回值,一定要等子线程计算完毕才行
#region 情况四
/// <summary>
/// 带返回值的Task,要使用返回值,一定要等子线程计算完毕才行
/// </summary>
/// <returns></returns>
private static async Task<long> Test4()
{
//主线程执行
Console.WriteLine("主线程{0}开始:", Thread.CurrentThread.ManagedThreadId);
long result = ;
//启动新线程完成任务
Task task = Task.Run(() =>
{
for (long i = ; i < ; i++)
{
result += i;
}
});
await task; //等待子线程执行完毕,方可执行后面的语句
Console.WriteLine("主线程{0}结束:", Thread.CurrentThread.ManagedThreadId);
Console.WriteLine("result:{0}", result);
return result;
}
#endregion
结果:

.Net进阶系列(14)-异步多线程(async和await)(被替换)的更多相关文章
- .Net进阶系列(11)-异步多线程(委托BeginInvoke)(被替换)
一. BeginInvoke最后两个参数的含义 倒数第二个参数:指该线程执行完毕后的回调函数:倒数第一个参数:可以向回调函数中传递参数. 下面以一段代码说明: /// <summary> ...
- .Net进阶系列(10)-异步多线程综述(被替换)
一. 综述 经过两个多个周的整理,异步多线程章节终于整理完成,如下图所示,主要从基本概念.委托的异步调用.Thread多线程.ThreadPool多线程.Task.Parallel并行计算.async ...
- .Net进阶系列(15)-异步多线程(线程的特殊处理和深究委托赋值)(被替换)
1. 线程的异常处理 我们经常会遇到一个场景,开启了多个线程,其中一个线程报错,导致整个程序崩溃.这并不是我们想要的,我需要的结果是,其中一个线程报错,默默的记录下,其它线程正常进行,保证程序整体可以 ...
- .Net进阶系列(13)-异步多线程(Task和Parallel)(被替换)
一. Task开启多线程的三种形式 1. 利用TaskFactory下的StartNew方法,向StartNew传递无参数的委托,或者是Action<object>委托. 2. 利用Tas ...
- .Net进阶系列(12)-异步多线程(Thread和ThreadPool)(被替换)
一. Thread多线程 1. 两种使用方式 通过F12查看Thread后,发现有两类构造函数,ParameterizedThreadStart和ThreadStart,其中 ThreadStar ...
- 反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑) C#中缓存的使用 C#操作redis WPF 控件库——可拖动选项卡的TabControl 【Bootstrap系列】详解Bootstrap-table AutoFac event 和delegate的分别 常见的异步方式async 和 await C# Task用法 c#源码的执行过程
反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑) 背景介绍: 为了平衡社区成员的贡献和索取,一起帮引入了帮帮币.当用户积分(帮帮点)达到一定数额之后,就会“掉落”一定数量的“帮帮 ...
- c#中@标志的作用 C#通过序列化实现深表复制 细说并发编程-TPL 大数据量下DataTable To List效率对比 【转载】C#工具类:实现文件操作File的工具类 异步多线程 Async .net 多线程 Thread ThreadPool Task .Net 反射学习
c#中@标志的作用 参考微软官方文档-特殊字符@,地址 https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/toke ...
- 异步多线程 Async
进程:进程是一个程序在电脑运行时,全部资源的合集叫进程 线程:是程序的最小执行单位,包含计算资源,任何一个操作的响应都是线程完成的. 多线程:多个线程并发执行 Thread 是.net框架封装 ...
- C#异步编程(async and await)及异步方法同步调用
1.什么是异步? 异步操作通常用于执行完成时间可能较长的任务,如打开大文件.连接远程计算机或查询数据库=异步操作在主应用程序线程以外的线程中执行.应用程序调用方法异步执行某个操作时,应用程序可在异步方 ...
随机推荐
- 安裝CentOS7后修復win7引导
想尝试双系统的心情想必大家都能理解,但是安装了双系统之后的收尾工作也是必不可少的,由于对Linux并不算很熟悉,所以在这方面花了不少时间,这里将CentOS7下修復windows7引导的解决方案记录下 ...
- 键盘事件(keyup、keydown、keypress)
1.onkeyup 和onkeydown时,keyCode是不区分大小写的,会将小写字母自动转化为大写字母. 2 onkeypress时,区分大小写. 3兼容event.keyCode||event. ...
- FICO基础知识(四)
What is the organizational structure for CO? Operating Concern 经营组织 Controlling Area 成本控制范围 Profit c ...
- 流程控制之if判断,while循环,for循环
if判断? 什么是if判断? 判断一个条件如果成立则做...不成立则... 为什么要有判断? 让计算机像人一样具备判断的能力 如何用if判断 if 条件1: code1 code2 cod ...
- lvs逻辑卷详解
管理磁盘空间对系统管理员来说是一件重要的日常工作.一旦磁盘空间耗尽就需要进行一系列耗时而又复杂的任务,以提升磁盘分区中可用的磁盘空间.它也需要系统离线才能处理.通常这种任务会涉及到安装一个新的硬盘.引 ...
- BZOJ3585&3339mex——主席树
题目描述 有一个长度为n的数组{a1,a2,...,an}.m次询问,每次询问一个区间内最小没有出现过的自然数. 输入 第一行n,m.第二行为n个数.从第三行开始,每行一个询问l,r. 输出 一行一个 ...
- day25 面向对象引子
面向对象编程所谓模子就是 类 抽象的,能知道什么属性,但是不知道属性具体值一切都是对象 有具体值 属性和技能都是根据类 模子来规范 # 人狗大战 # 角色模型 # 人的模型 def Person(na ...
- 自学Linux Shell7.1-linux用户账户和组
点击返回 自学Linux命令行与Shell脚本之路 7.1-linux用户账户和组 linux安全系统的核心是用户账户.每个能进入linux系统的用户都会被分配唯一的用户账户,用户对系统中各对象的访问 ...
- Haproxy Mysql cluster 高可用Mysql集群
-----client-----------haproxy---------mysql1----------mysql2------192.168.1.250 192.168.1.1 192.168. ...
- C++类间相互引用
两个类相互包含引用的问题 不管是下文中提到的例子,还是任何情况,使得class A的头文件需要include class B的头文件,class B的也要引用A的头文件,这种状况下,貌似会出现有一个类 ...