C#异步延迟Task.Delay
一.
1.Task.Delay实质是创建一个任务,再任务中开启一个定时间,然后延时指定的时间
2.Task.Delay不和await一起使用情况,当代码遇到Task.Delay一句时,创建了了一个新的任务去执行延时去了,当前代码继续往下执行
3.Task.Delay和await一起使用,当代码遇到await Task.Delay时候,当前线程要等该行代码执行完成后,再继续执行后面的代码

代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms; namespace _006__Task.Delay
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
} private void btnDelayNoAwait_Click(object sender, EventArgs e)
{
Task task = Task.Factory.StartNew(() =>
{
Console.WriteLine($" Task.Delay开始:{DateTime.Now.ToString(" HH:mm:ss.fff")}");
for (int i = 0; i < 10; i++)
{
Console.WriteLine($" {DateTime.Now.ToString("HH:mm:ss.fff")} 正在进行:{i}");
Task.Delay(2000);
}
Console.WriteLine($" Task.Delay结束:{DateTime.Now.ToString("HH:mm:ss.fff")}");
Console.ReadKey();
}); } private void btnDelayHaveAwait_Click(object sender, EventArgs e)
{
Task task = Task.Factory.StartNew(async () =>
{
Console.WriteLine($" Task.Delay 有await 开始:{DateTime.Now.ToString("HH:mm:ss.fff")}");
for (int i = 0; i < 10; i++)
{
Console.WriteLine($" {DateTime.Now.ToString("HH:mm:ss.fff")} 有await正在进行:{i}");
await Task.Delay(2000);
}
Console.WriteLine($" Task.Delay 有await 结束:{DateTime.Now.ToString("HH:mm:ss.fff")}");
Console.ReadKey();
});
} private void btnThreadSleep_Click(object sender, EventArgs e)
{
Task task = Task.Factory.StartNew(() =>
{
Console.WriteLine($" Task.Delay 有await 开始:{DateTime.Now.ToString("HH:mm:ss.fff")}");
for (int i = 0; i < 10; i++)
{
Console.WriteLine($" {DateTime.Now.ToString("HH:mm:ss.fff")} 有await正在进行:{i}");
Thread.Sleep(2000);
}
Console.WriteLine($" Task.Delay 有await 结束:{DateTime.Now.ToString("HH:mm:ss.fff")}");
Console.ReadKey();
});
}
}
}
按钮【Task.Delay(不带await)】执行结果:
当程序遇到 Task.Delay(2000);时候,程序创建一个新的任务去执行延时2000了,当前任务继续向下执行,所以看起来并没有延时2秒的现象。
例如:你只有先写完作业,然后才能看电视。但是到写作业的时候,你让其他人帮你写(开启新的任务去执行延时),你继续去看电视(继续当前任务)。

按钮【Task.Delay(带await)】执行结果(推荐):
当程序遇到 await Task.Delay(2000);时候,当前任务,要等到新创建的任务执行完延时2000后,才继续后面的代码
例如:你只有先写完作业,然后才能看电视。但是到写作业的时候,你mother在旁边看着你,直到你写完作业(开启新的任务去执行延时),你才可以继续去看电视(继续当前任务)。

按钮【Thread.Sleep()】执行结果(不推荐):
Thread.Sleep 是让当前线程休眠指定的时间。在异步中是不推荐使用Thread.Sleep 的。

C#异步延迟Task.Delay的更多相关文章
- Task C# 多线程和异步模型 TPL模型 【C#】43. TPL基础——Task初步 22 C# 第十八章 TPL 并行编程 TPL 和传统 .NET 异步编程一 Task.Delay() 和 Thread.Sleep() 区别
Task C# 多线程和异步模型 TPL模型 Task,异步,多线程简单总结 1,如何把一个异步封装为Task异步 Task.Factory.FromAsync 对老的一些异步模型封装为Task ...
- Task.Delay() 和 Thread.Sleep() 区别
1.Thread.Sleep 是同步延迟,Task.Delay异步延迟. 2.Thread.Sleep 会阻塞线程,Task.Delay不会. 3.Thread.Sleep不能取消,Task.Dela ...
- Thread.Sleep(1000) 、Task.Delay(1000).Wait() 区别
public static Task Delay(int millisecondsDelay, CancellationToken cancellationToken){ if (millise ...
- task.delay 和 thread.sleep
1.Thread.Sleep 是同步延迟. Task.Delay异步延迟. 2.Thread.Sleep 会阻塞线程,Task.Delay不会. 3.Thread.Sleep不能取消,Task.Del ...
- Task.Delay方法的2个应用实例,单元测试等待,限时限次下载远程资源
如果想让程序异步等待一段时间,可以考虑使用Task.Delay方法. 比如,在单元测试中模拟一个异步操作. static async Task<T> DelayedResult<T& ...
- 15.3 Task Task.Yield和Task.Delay说明
https://blog.csdn.net/hurrycxd/article/details/79827958 书上看到一个Task.Yield例子,Task.Yield方法创建一个立即返回的awai ...
- Thread.Sleep vs. Task.Delay
We use both Thread.Sleep() and Task.Delay() to suspend the execution of a program for some given tim ...
- .Net4.0如何实现.NET4.5中的Task.Run及Task.Delay方法
前言 .NET4.0下是没有Task.Run及Task.Delay方法的,而.NET4.5已经实现,对于还在使用.NET4.0的同学来说,如何在.NET4.0下实现这两个方法呢? 在.NET4.0下, ...
- C# 异步编程Task整理(二)异常捕捉
一.在任务并行库中,如果对任务运行Wait.WaitAny.WaitAll等方法,或者求Result属性,都能捕获到AggregateException异常. 可以将AggregateExceptio ...
随机推荐
- Spring Ioc源码分析系列--Ioc的基础知识准备
Spring Ioc源码分析系列--Ioc的基础知识准备 本系列文章代码基于Spring Framework 5.2.x Ioc的概念 在Spring里,Ioc的定义为The IoC Containe ...
- Blazor Hybrid / MAUI 简介和实战
1. Blazor Blazor 是一个使用 .NET 生成交互式客户端 Web UI 的框架: 使用 C# 代替 JavaScript 来创建信息丰富的交互式 UI. 共享使用 .NET 编写的服务 ...
- 国产化设备鲲鹏CentOS7上源码安装Python3.7
具体编译过成与正常的Python源代码在x86平台上的过程无异,此篇随笔仅当用作复制黏贴的备忘录.不得不说在一个老旧系统上安装一个老旧的Python版本,从头编译一个Python还是一个较为稳健的选择 ...
- 用树莓派USB摄像头做个监控
[前言] 看着阴暗的角落里吃灰噎到嗓子眼的树莓派,一起陪伴的时光历历在目,往事逐渐涌上心头,每每触及此处,内心总会升腾起阵阵怜悯之情... 我这有两个设备,一个是积灰已久的树莓派,另一个是积灰已久的U ...
- Typecho博客转移服务器,数据备份.
目录 Typecho博客转移服务器,数据备份. 简述操作(有基础的mjj看这个简述就可以了.) 详细步骤(建议小白来看, 已经在很多详细方面进行说明了.) 备份篇 备份导入与数据库转移篇 重新部署ty ...
- PyTorch保存模型、冻结参数等
此外可以参考PyTorch模型保存.https://zhuanlan.zhihu.com/p/73893187 查看模型每层输出详情 Keras有一个简洁的API来查看模型的每一层输出尺寸,这在调试网 ...
- Canal-监听数据库表的变化
1. 简介 Canal是阿里巴巴旗下的一款开源项目,纯Java开发.基于数据库增量日志解析,提供增量数据订阅&消费功能. 工作原理 Mysql主备复制原理 MySQL master 将数据变更 ...
- c++可视化性能测试
阅读前注意 本文所有代码贴出来的目的是帮助大家理解,并非是要引导大家跟写,许多环境问题文件问题没有详细说明,代码也并不全面,达不到跟做的效果.建议直接阅读全文即可,我在最后会给出详细代码地址,对源代码 ...
- 软件项目管理 7.5.项目进度模型(SPSP)
[公众号@ "项目管理研究所" 将会第一时间更新文章并分享<行业分析报告>] 归档于软件项目管理初级学习路线 第七章 软件项目进度计划 你猜猜里面是什么-->&l ...
- 过年了,基于Vue做一个消息通知组件
前言 今天除夕,在这里祝大家新年快乐!!!今天在这个特别的日子里我们做一个消息通知组件,好,我们开始行动起来吧!!!项目一览 效果很简单,就是这种的小卡片似的效果. 我们先开始写UI页面,可自定义消息 ...