C#学习笔记-Task.Delay和Thread.Sleep的区别

当我们在代码中的调用await Task.Delay(x),我们并不是在指示程序“此处暂停x毫秒”,而是在说:“我已经完成了我能做的所有工作,你可以去运行其他任务了,x毫秒后请唤醒我继续我的工作”。这样看起来,Task.Delay并不像是一个暂停指令,而更像是一个让时间调度器知道当前任务可以被暂时挂起,而去运行其他任务的信号。

下面这个例子或许可以更明确地展示Task.Delay和Thread.Sleep的区别:

using System;
using System.Threading;
using System.Threading.Tasks;
using ConsoleApp1;

public class 
C#里,Task.Delayawait的区别如下: ### 功能用途 - **Task.Delay**:返回代表延迟任务的Task对象,借助已有的Timer计时器(操作系统的定时机制)在后台计时,不占用任何线程。主要用于引入延迟,也就是让程序在特定时间内暂停执行,比如模拟网络请求的延迟或者定时执行某些操作[^2]。 - **await**:并非一个独立的操作,它是用于异步编程的关键字,只能在使用`async`关键字修饰的异步方法里使用。其作用是等待一个异步操作完成,在等待期间,方法会把控制权交回给调用者,使调用者能够继续执行其他任务,而不是阻塞线程。待异步操作完成后,方法会接着执行后续代码[^1][3]。 ### 对线程的影响 - **Task.Delay**:不阻塞当前线程,在延迟期间,当前线程可去执行其他任务。它会利用操作系统的定时机制来计时,等延迟时间结束,后续操作会由线程池中的线程接着执行[^2][3]。 - **await**:本身不直接影响线程,不过它会改变代码的执行流程。当碰到`await`表达式时,当前方法会暂停执行,把控制权交回给调用者,当前线程就能去处理其他任务。等异步操作完成后,后续代码可能由线程池中的不同线程来执行,这意味着执行代码的线程也许会被切换[^3]。 ### 使用方式 - **Task.Delay**:一般`await`结合使用,以此实现异步延迟。示例代码如下: ```csharp using System; using System.Threading.Tasks; class Program { static async Task Main() { Console.WriteLine("开始延迟"); await Task.Delay(2000); // 延迟2秒 Console.WriteLine("延迟结束"); } } ``` - **await**:要返回`Task`或者`Task<T>`的异步方法搭配使用,例如`Task.Delay`、`HttpClient.GetAsync`等。示例代码如下: ```csharp using System; using System.Net.Http; using System.Threading.Tasks; class Program { static async Task Main() { HttpClient client = new HttpClient(); HttpResponseMessage response = await client.GetAsync("https://www.example.com"); // 等待HTTP请求完成 Console.WriteLine("请求完成"); } } ``` ### 执行顺序 - **Task.Delay**:会启动一个延迟任务,不过这个任务的执行顺序取决于代码的编写异步操作的调度。要是没有使用`await`等待`Task.Delay`,后续代码会立即执行,不会等待延迟结束[^1]。 - **await**:会强制后续代码等待异步操作完成之后再执行,保证代码按顺序执行。例如: ```csharp using System; using System.Threading.Tasks; class Program { static async Task Main() { Console.WriteLine("第一步"); await Task.Delay(2000); // 等待2秒 Console.WriteLine("第二步"); } } ``` 在上述代码中,“第二步”会在延迟2秒之后才输出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值