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说明相关推荐

  1. Task.Factory.StartNewTResult 和 Task.RunTResult 到底有什么区别?

    前言 这不是和<Task.Factory.StartNew 和 Task.Run 到底有什么区别?>一样吗,怎么又写一篇? 起先我也是这么觉得的,但实际发现并非如此. 实现代码 查看这 2 ...

  2. .NET 中 如果一个Task A正在await另一个Task B,那么Task A是什么状态

    .NET 中 如果一个Task A正在await另一个Task B,那么Task A是什么状态?答案是:WaitingForActivation 新建一个.NET Core控制台程序,输入如下代码: ...

  3. android自定义task,Android Gradle 自定义Task 详解

    一:Gradle 是什么 Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建工具. 它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于X ...

  4. Task.Factory.StartNew 和 Task.Run 到底有什么区别?

    前言 Task.Factory.StartNew 和 Task.Run 都可以创建 Task: Task.Factory.StartNew(() => { Console.WriteLine(& ...

  5. Task.Factory.StartNew 和 Task.Factory.FromAsync 有什么区别?

    咨询区 soleiljy 假设我们有一个涉及IO操作的方法 (读取数据库),这个方法支持以同步或者异步的方式执行. 同步方式 IOMethod() 异步方式 BeginIOMethod()  EndI ...

  6. C# Task 循环任务_C# Task.Run调用外部参数

    首先讲一下: c# Task启动带参数和返回值的方法: Task启动带参数 Task.Run(() => test("123")); public void Test(str ...

  7. android定义 task,Android Gradle 自定义Task 详解

    一:Gradle 是什么 Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建工具. 它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于X ...

  8. C语言task的用法,C# Task 用法

    C# Task 的用法 其实Task跟线程池ThreadPool的功能类似,不过写起来更为简单,直观.代码更简洁了,使用Task来进行操作.可以跟线程一样可以轻松的对执行的方法进行控制. 顺便提一下, ...

  9. C语言中task的用法,C# Task详解

    C# Task详解  https://www.cnblogs.com/zhaoshujie/p/11082753.html 1.Task的优势 ThreadPool相比Thread来说具备了很多优势, ...

最新文章

  1. CSS过渡动画的理解
  2. Cardinality 对执行计划的重要性
  3. appium 3 跑起来
  4. C# 系统应用之Cookie\Session基础知识及php读取Cookie\Session
  5. MySQL高级 - SQL技巧 -日期函数与聚合函数
  6. 前端如何实现网络速度测试功能_分析Web前端测试要点,从架构原理上进行分析,希望大家能够掌握...
  7. 用C语言编写绳索运动函数,福建省教师招聘考试小学数学真题试卷
  8. CSS轮廓样式属性为,简述CSS轮廓样式
  9. MyEclipse 7.0 用java代码生成序列号
  10. 安卓中的数据存储方式以及ContentProvider的简单介绍
  11. dx11 将纹理保存到dds
  12. 51单片机c语言数组怎么用,51单片机之C语言-4.2数组
  13. 推荐几个自己用过的软件测试博客论坛
  14. 为了下一代,抖音真的该关了---读<<我观察到的牛人有这三个特质>>有感
  15. 微信小程序使用echarts
  16. 印象笔记终于支持默认markdown预览模式
  17. dell服务器报错信息,DELL 服务器LED屏报错信息 2012版
  18. 从方法到实践:主数据全生命周期管理
  19. OCJP(1Z0-851) 模拟题分析(二)
  20. requests+pytest+allure接口测试框架搭建

热门文章

  1. 白盒测试工具 - sonar的安装、配置与使用入门手册,用sonar检查代码质量实战演示
  2. c# 学习笔记 (1) 类型转换
  3. 在字符串中查找指定的字符串--strstr
  4. 第八周实践项目9 算法库——广义表
  5. Simulink仿真 离散系统仿真
  6. Mallet Java【Windows下配置】(解决Ant安装可能会失败的解决方案)
  7. 【mysql】已经创建表后,修改某列的默认值
  8. tf.placehoder使用
  9. 【解决方案】requests.exceptions.SSLError: HTTPSConnectionPool
  10. maven和gradle中,dependency和plugin的区别