15.3 Task Task.Yield和Task.Delay说明
https://blog.csdn.net/hurrycxd/article/details/79827958
书上看到一个Task.Yield例子,Task.Yield方法创建一个立即返回的awaitable。等待一个Yield可以让异步方法在执行后续的部分时返回到调用方法。可以理解为离开当前的消息队列,回到队列末尾,让处理器有时间处理其他任务。
Yield方法在GUI编程中非常的有用,可以中断大量的工作,让其他任务使用处理器。看下面的代码:
1 static void Main(string[] args) 2 { 3 Task<int> value = FindSeriesSum(100000); 4 Console.WriteLine("主线其他任务开始"); 5 CountBig(10000); 6 CountBig(10001); 7 CountBig(10002); 8 Thread.Sleep(1000); 9 CountBig(10003); 10 Console.WriteLine("Length =" + value.Result); 11 Console.ReadKey(); 12 } 13 public static async Task<int> FindSeriesSum(int i1) 14 { 15 int sum = 0; 16 for (int i = 0; i < i1; i++) 17 { 18 sum += i1; 19 if (i % 20000 == 0) 20 { 21 await Task.Yield(); 22 Console.WriteLine("i % 20000 :i=" + i); 23 } 24 } 25 WebClient wc = new WebClient(); 26 Console.WriteLine("开始下载任务"); 27 string str = await wc.DownloadStringTaskAsync("https://www.baidu.com"); 28 return str.Length; 29 } 30 private static void CountBig(int p) 31 { 32 for (int i = 0; i < p; i++) 33 { 34 if (i == p - 1) 35 Console.WriteLine("p =" + p); 36 } 37 }
在执行下载任务await wc.DownloadStringTaskAsync("https://github.com/")前进行了大量的CPU运算,那么线程会等到第一个await的时候才会异步执行CountBig(10000);
程序运行的结果如下:
i % 20000 :i=0
i % 20000 :i=20000
i % 20000 :i=40000
i % 20000 :i=60000
i % 20000 :i=80000
开始下载任务
主线其他任务开始
p =10000
p =10001
p =10002
p =10003
Length =52728
我们需要立即返回的awaitable,让程序执行其他的任务,去掉//await Task.Yield();前面的注释符,得到的结果如下:
i % 20000 :i=0
主线其他任务开始
p =10000
i % 20000 :i=20000
p =10001
p =10002
i % 20000 :i=40000
i % 20000 :i=60000
i % 20000 :i=80000
开始下载任务
p =10003
Length =52728
可以看到现在开始下载任务之前就可以执行其他的任务了。最大条件的利用了资源。
Task.Delay方法创建一个Task对象,该对象暂停其在线程中的处理。
与Thread.Sleep()阻塞线程不同的是,Task.Delay不会阻塞线程,线程可以继续处理其它的工作。
1 static void Main(string[] args) 2 { 3 Task<int> value = FindSeriesSum(100000); 4 Console.WriteLine("主线其他任务开始"); 5 CountBig(10000); 6 CountBig(10001); 7 CountBig(10002); 8 Thread.Sleep(1000); 9 CountBig(10003); 10 Console.WriteLine("Length =" + value.Result); 11 Console.ReadKey(); 12 } 13 public static async Task<int> FindSeriesSum(int i1) 14 { 15 await Task.Delay(1000); 16 WebClient wc = new WebClient(); 17 Console.WriteLine("开始下载任务"); 18 string str = await wc.DownloadStringTaskAsync("https://www.baidu.com"); 19 return str.Length; 20 } 21 private static void CountBig(int p) 22 { 23 for (int i = 0; i < p; i++) 24 { 25 if (i == p - 1) 26 Console.WriteLine("p =" + p); 27 } 28 }
主线其他任务开始
p =10000
p =10001
p =10002
开始下载任务
p =10003
Length =52728
转载于:https://www.cnblogs.com/kikyoqiang/p/10127962.html
15.3 Task Task.Yield和Task.Delay说明相关推荐
- Task.Factory.StartNewTResult 和 Task.RunTResult 到底有什么区别?
前言 这不是和<Task.Factory.StartNew 和 Task.Run 到底有什么区别?>一样吗,怎么又写一篇? 起先我也是这么觉得的,但实际发现并非如此. 实现代码 查看这 2 ...
- .NET 中 如果一个Task A正在await另一个Task B,那么Task A是什么状态
.NET 中 如果一个Task A正在await另一个Task B,那么Task A是什么状态?答案是:WaitingForActivation 新建一个.NET Core控制台程序,输入如下代码: ...
- android自定义task,Android Gradle 自定义Task 详解
一:Gradle 是什么 Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建工具. 它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于X ...
- Task.Factory.StartNew 和 Task.Run 到底有什么区别?
前言 Task.Factory.StartNew 和 Task.Run 都可以创建 Task: Task.Factory.StartNew(() => { Console.WriteLine(& ...
- Task.Factory.StartNew 和 Task.Factory.FromAsync 有什么区别?
咨询区 soleiljy 假设我们有一个涉及IO操作的方法 (读取数据库),这个方法支持以同步或者异步的方式执行. 同步方式 IOMethod() 异步方式 BeginIOMethod() EndI ...
- C# Task 循环任务_C# Task.Run调用外部参数
首先讲一下: c# Task启动带参数和返回值的方法: Task启动带参数 Task.Run(() => test("123")); public void Test(str ...
- android定义 task,Android Gradle 自定义Task 详解
一:Gradle 是什么 Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建工具. 它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于X ...
- C语言task的用法,C# Task 用法
C# Task 的用法 其实Task跟线程池ThreadPool的功能类似,不过写起来更为简单,直观.代码更简洁了,使用Task来进行操作.可以跟线程一样可以轻松的对执行的方法进行控制. 顺便提一下, ...
- C语言中task的用法,C# Task详解
C# Task详解 https://www.cnblogs.com/zhaoshujie/p/11082753.html 1.Task的优势 ThreadPool相比Thread来说具备了很多优势, ...
最新文章
- CSS过渡动画的理解
- Cardinality 对执行计划的重要性
- appium 3 跑起来
- C# 系统应用之Cookie\Session基础知识及php读取Cookie\Session
- MySQL高级 - SQL技巧 -日期函数与聚合函数
- 前端如何实现网络速度测试功能_分析Web前端测试要点,从架构原理上进行分析,希望大家能够掌握...
- 用C语言编写绳索运动函数,福建省教师招聘考试小学数学真题试卷
- CSS轮廓样式属性为,简述CSS轮廓样式
- MyEclipse 7.0 用java代码生成序列号
- 安卓中的数据存储方式以及ContentProvider的简单介绍
- dx11 将纹理保存到dds
- 51单片机c语言数组怎么用,51单片机之C语言-4.2数组
- 推荐几个自己用过的软件测试博客论坛
- 为了下一代,抖音真的该关了---读<<我观察到的牛人有这三个特质>>有感
- 微信小程序使用echarts
- 印象笔记终于支持默认markdown预览模式
- dell服务器报错信息,DELL 服务器LED屏报错信息 2012版
- 从方法到实践:主数据全生命周期管理
- OCJP(1Z0-851) 模拟题分析(二)
- requests+pytest+allure接口测试框架搭建
热门文章
- 白盒测试工具 - sonar的安装、配置与使用入门手册,用sonar检查代码质量实战演示
- c# 学习笔记 (1) 类型转换
- 在字符串中查找指定的字符串--strstr
- 第八周实践项目9 算法库——广义表
- Simulink仿真 离散系统仿真
- Mallet Java【Windows下配置】(解决Ant安装可能会失败的解决方案)
- 【mysql】已经创建表后,修改某列的默认值
- tf.placehoder使用
- 【解决方案】requests.exceptions.SSLError: HTTPSConnectionPool
- maven和gradle中,dependency和plugin的区别