.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.什么是异步? 异步操作通常用于执行完成时间可能较长的任务,如打开大文件.连接远程计算机或查询数据库=异步操作在主应用程序线程以外的线程中执行.应用程序调用方法异步执行某个操作时,应用程序可在异步方 ...
随机推荐
- Windows Server 2008 双网卡 断网问题 总结
实施现场的情况,一个网卡接得是聚合APN的子网,一个网卡是借得局域网. 运行一份数据收发程序,从APN网接入数据,发送给局域网,程序启动一会儿后就崩溃,此时测试网卡就Ping网关了,或者是时断时续,逐 ...
- []转帖] 浅谈Linux下的五种I/O模型
浅谈Linux下的五种I/O模型 https://www.cnblogs.com/chy2055/p/5220793.html 一.关于I/O模型的引出 我们都知道,为了OS的安全性等的考虑,进程是 ...
- [读书笔记]Linux命令行与shell编程读书笔记04 安装软件,编辑器注意事项
1. debian以及redhat两种主流的linux发行版用的包管理工具 debian的包管理工具是 dpkg 再现安装的是 apt apt的工具主要有 apt-get apt-cache apti ...
- 搭建Spark所遇过的坑
一.经验 1.Spark Streaming包含三种计算模式:nonstate .stateful .window 2.kafka可通过配置文件使用自带的zookeeper集群 3.Spark一切操作 ...
- 使用 py.test 对 python 代码进行测试
其实以前我记得有人对我说过,写代码甚至可以先写完测试之后部署好了再开始写逻辑代码.我觉得有点吃惊和奇怪,这不是扯淡吗? 但是这次在完成了积分支付第一阶段开发之后我意识到,这可能并不是开玩笑,特别是项目 ...
- Maven- 自动导入包的方法-很多没有导入的类,如何处理
(1) 比如在pom.xml文件里面引入了类,但是在java中使用这个类的时候,还是报错,那就点击Maven.projects的 左上角的刷新的按钮: (2) 在Maven项目的时候,发现很多的类没有 ...
- loadrunner基础学习笔记四
在loadrunner中,通过将一系列操作标记为事务,可以将它们指定为要评测的操作. loadrunner收集关于事务执行时间长度的信息,并将结果显示在用不同单色标识的图和报告中. 可以这些信息了解应 ...
- 【Spring】—— 自动装配
一.Spring中装配bean的方式 1.在XML中显式配置 2.在Java中进行显式配置 3.隐士的bean发现机制和自动装配 二.自动装配示例 1.在需要装配到其他bean中的类中加入@Compo ...
- python之查询指定目录下的最新文件
使用os模块查询指定目录下的最新文件 import os # 输入目录路径,输出最新文件完整路径 def find_new_file(dir): '''查找目录下最新的文件''' file_lists ...
- 【转】Caffe的solver文件配置
http://blog.csdn.net/czp0322/article/details/52161759 solver.prototxt 今天在做FCN实验的时候,发现solver.prototxt ...