0

0

c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗

月夜之吻

月夜之吻

发布时间:2026-01-02 07:17:13

|

154人浏览过

|

来源于php中文网

原创

Task.Yield()本质是让出当前上下文、强制触发await挂起与恢复,使后续代码延至下一调度周期执行;Task.Delay(1)则是真实等待至少1毫秒,依赖系统计时器且不可靠。

c# task.yield 的作用是什么 它和task.delay(1)有区别吗

Task.Yield() 的本质是“让出当前上下文,但不引入真实延迟”

它不是“睡一会儿”,而是告诉调度器:“我先不占着了,你爱干啥干啥,等轮到我再继续”。Task.Yield() 返回一个**已创建即完成(completed)但被标记为需异步延续**的 Task——关键在于:它会强制触发一次 await 的“挂起 + 恢复”流程,从而把后续代码推到**下一个调度周期**执行。这意味着:UI 线程不会卡住、线程池线程不会被白占着、await 后的代码一定在下一轮消息循环或线程池调度中运行

  • 它不依赖时间,不计时,不消耗 CPU 做轮询
  • 它不阻塞线程,也不释放线程(只是让出控制权)
  • 它在有同步上下文(如 WinForms/WPF/Blazor Server)时,会回到原上下文;在线程池环境(TaskScheduler.Default)中,大概率由另一个线程池线程继续执行

Task.Delay(1) 是“真等 1 毫秒”,行为完全不同

Task.Delay(1) 会启动一个底层计时器(TimerThreadPool.UnsafeQueueUserWorkItem),并返回一个**尚未完成**的 Task。它必须等到系统时钟走完至少 1ms(实际常更久,受系统精度和调度影响),才触发完成回调。虽然 1ms 很短,但它:引入真实等待、占用计时器资源、可能跨线程回调、且无法保证“下一帧”就执行

  • 在 UI 应用中,await Task.Delay(1) 通常也能让界面响应,但这是靠“等了一小会儿”换来的,不是设计意图
  • 在高并发服务端,大量 Task.Delay(1) 会创建大量短期计时器,增加内核调度开销
  • 它不能替代 Task.Yield() 的“切点”作用——比如你想确保某段逻辑不和前序同步代码挤在同一调度单元里,Task.Delay(1) 不够可靠(可能仍被调度器连续安排)

实操对比:三行代码就能看出区别

static async Task Demo()
{
    Console.WriteLine($"Start: {DateTime.Now:HH:mm:ss.fff}");
    
    await Task.Yield(); // ← 立即让出,下一调度周期恢复
    // await Task.Delay(1); // ← 真等至少 1ms,再恢复
    
    Console.WriteLine($"After yield: {DateTime.Now:HH:mm:ss.fff}");
}

调用它后你会看到:StartAfter yield 的时间戳几乎总在不同毫秒(哪怕只差 0.1ms),因为执行被明确切开了;而换成 Task.Delay(1),两者大概率差 ≥1ms,且可能因系统负载出现 2~15ms 的抖动。

什么时候该用哪个?别混淆核心目的

Task.Yield() 当你需要:

Open Voice OS
Open Voice OS

OpenVoiceOS是一个社区驱动的开源语音AI平台

下载
  • 打破同步执行链,避免 UI 冻结(比如长循环中插入一次让出)
  • 确保后续代码不在当前同步上下文“原子块”内执行(如测试异步状态机行为)
  • 实现轻量级协作式让权(类似纤程 yield),又不想引入定时器开销

Task.Delay(N) 当你需要:

  • 真正的延时(重试退避、节流、模拟网络延迟)
  • 等待某个时间点之后再做操作
  • 配合 CancellationToken 实现可取消的等待

顺带提一句:Task.Delay(0) 并不等价于 Task.Yield()——它返回一个已完成任务,await 它不会让出,而是直接同步往下走,这点很多人会误判。

相关专题

更多
线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

480

2023.08.10

default gateway怎么配置
default gateway怎么配置

配置default gateway的步骤:1、了解网络环境;2、获取路由器IP地址;3、登录路由器管理界面;4、找到并配置WAN口设置;5、配置默认网关;6、保存设置并退出;7、检查网络连接是否正常。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

219

2023.12.07

Golang gRPC 服务开发与Protobuf实战
Golang gRPC 服务开发与Protobuf实战

本专题系统讲解 Golang 在 gRPC 服务开发中的完整实践,涵盖 Protobuf 定义与代码生成、gRPC 服务端与客户端实现、流式 RPC(Unary/Server/Client/Bidirectional)、错误处理、拦截器、中间件以及与 HTTP/REST 的对接方案。通过实际案例,帮助学习者掌握 使用 Go 构建高性能、强类型、可扩展的 RPC 服务体系,适用于微服务与内部系统通信场景。

8

2026.01.15

公务员递补名单公布时间 公务员递补要求
公务员递补名单公布时间 公务员递补要求

公务员递补名单公布时间不固定,通常在面试前,由招录单位(如国家知识产权局、海关等)发布,依据是原入围考生放弃资格,会按笔试成绩从高到低递补,递补考生需按公告要求限时确认并提交材料,及时参加面试/体检等后续环节。要求核心是按招录单位公告及时响应、提交材料(确认书、资格复审材料)并准时参加面试。

38

2026.01.15

公务员调剂条件 2026调剂公告时间
公务员调剂条件 2026调剂公告时间

(一)符合拟调剂职位所要求的资格条件。 (二)公共科目笔试成绩同时达到拟调剂职位和原报考职位的合格分数线,且考试类别相同。 拟调剂职位设置了专业科目笔试条件的,专业科目笔试成绩还须同时达到合格分数线,且考试类别相同。 (三)未进入原报考职位面试人员名单。

52

2026.01.15

国考成绩查询入口 国考分数公布时间2026
国考成绩查询入口 国考分数公布时间2026

笔试成绩查询入口已开通,考生可登录国家公务员局中央机关及其直属机构2026年度考试录用公务员专题网站http://bm.scs.gov.cn/pp/gkweb/core/web/ui/business/examResult/written_result.html,查询笔试成绩和合格分数线,点击“笔试成绩查询”按钮,凭借身份证及准考证进行查询。

10

2026.01.15

Java 桌面应用开发(JavaFX 实战)
Java 桌面应用开发(JavaFX 实战)

本专题系统讲解 Java 在桌面应用开发领域的实战应用,重点围绕 JavaFX 框架,涵盖界面布局、控件使用、事件处理、FXML、样式美化(CSS)、多线程与UI响应优化,以及桌面应用的打包与发布。通过完整示例项目,帮助学习者掌握 使用 Java 构建现代化、跨平台桌面应用程序的核心能力。

65

2026.01.14

php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

36

2026.01.13

PHP 高性能
PHP 高性能

本专题整合了PHP高性能相关教程大全,阅读专题下面的文章了解更多详细内容。

75

2026.01.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号