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() 当你需要:

蝉妈妈AI
蝉妈妈AI

电商人专属的AI营销助手

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

Task.Delay(N) 当你需要:

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

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

相关专题

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

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

472

2023.08.10

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

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

219

2023.12.07

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

61

2025.12.31

php网站源码教程大全
php网站源码教程大全

本专题整合了php网站源码相关教程,阅读专题下面的文章了解更多详细内容。

41

2025.12.31

视频文件格式
视频文件格式

本专题整合了视频文件格式相关内容,阅读专题下面的文章了解更多详细内容。

32

2025.12.31

不受国内限制的浏览器大全
不受国内限制的浏览器大全

想找真正自由、无限制的上网体验?本合集精选2025年最开放、隐私强、访问无阻的浏览器App,涵盖Tor、Brave、Via、X浏览器、Mullvad等高自由度工具。支持自定义搜索引擎、广告拦截、隐身模式及全球网站无障碍访问,部分更具备防追踪、去谷歌化、双内核切换等高级功能。无论日常浏览、隐私保护还是突破地域限制,总有一款适合你!

41

2025.12.31

出现404解决方法大全
出现404解决方法大全

本专题整合了404错误解决方法大全,阅读专题下面的文章了解更多详细内容。

198

2025.12.31

html5怎么播放视频
html5怎么播放视频

想让网页流畅播放视频?本合集详解HTML5视频播放核心方法!涵盖<video>标签基础用法、多格式兼容(MP4/WebM/OGV)、自定义播放控件、响应式适配及常见浏览器兼容问题解决方案。无需插件,纯前端实现高清视频嵌入,助你快速打造现代化网页视频体验。

9

2025.12.31

关闭win10系统自动更新教程大全
关闭win10系统自动更新教程大全

本专题整合了关闭win10系统自动更新教程大全,阅读专题下面的文章了解更多详细内容。

8

2025.12.31

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
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号