当前位置: 首页 > news >正文

【C#】await Task.Delay(100)与Thread.Sleep(100)?

非常好的问题 👍。
这两个看起来只是“延时 100ms”,但机制完全不同,用错了地方会让 UI 卡顿、异步逻辑乱掉。下面用你现在的项目(WinForms + 异步烧录)场景来解释最清楚。


一、await Task.Delay(100) ——【异步等待,不阻塞线程】

  • 特征:不会卡界面(UI 仍可刷新、进度条动、按钮响应)。

  • 用途

    1. 异步方法内部需要“等一会”再做下一步,例如:

      await Task.Delay(100); // 不会卡界面
      
    2. 在 UI 程序(WinForms/WPF/UWP)中,要暂缓执行但不冻结界面

    3. 在烧录进程中用来给设备留一点响应时间(如断开后等硬件稳定)。

  • 要求:所在方法必须是 async,如:

    private async void btnStartUpgrade_Click(object sender, EventArgs e)
    {ToggleAllUI(false);await Task.Delay(100);// 后续代码ToggleAllUI(true);
    }
    

** 程序里大多数地方应该用 await Task.Delay()**
因为这是一个带 UI 的异步应用,使用 Thread.Sleep() 会卡死界面,进度条不刷新、界面“假死”。


二、Thread.Sleep(100) ——【同步阻塞当前线程】

  • 特征:当前线程彻底暂停 100ms。

    • 如果这个线程是 UI 主线程,界面会“卡顿”。
    • 如果在线程池(后台线程)里,用它问题不大。
  • 用途

    1. 后台线程控制台程序 里,用来做同步等待。
      例如:

      Thread.Sleep(100);
      
    2. 调试底层通讯逻辑(非 UI)里,简单暂停。

    3. 在你不希望方法是异步的、或没有异步上下文时(例如静态同步函数)。

在 UI 线程上用 Thread.Sleep() 的后果

  • “一键烧录”按钮会卡住 100ms。
  • 进度条无法刷新。
  • “未响应”灰屏现象(尤其在长一点的 Sleep)。

三、项目实战建议

场景推荐方式原因
UI 界面逻辑(按钮点击、进度更新)await Task.Delay()不卡界面
异步任务轮询(如轮询进度)await Task.Delay()可以取消、节能
后台通信线程(非 UI)🟡 Thread.Sleep() 可接受不影响界面
快速调试或测试延迟🟡 都可,但最终应换成 await Task.Delay()保持一致性

举例对比

** 错误写法(UI 卡顿):**

private void btnStartUpgrade_Click(object sender, EventArgs e)
{ToggleAllUI(false);Thread.Sleep(5000); // 卡死界面 5 秒ToggleAllUI(true);
}

** 正确写法(界面不卡):**

private async void btnStartUpgrade_Click(object sender, EventArgs e)
{ToggleAllUI(false);await Task.Delay(5000); // 等 5 秒但界面可操作ToggleAllUI(true);
}

记忆口诀:

  • UI 要动,用 await Task.Delay()
  • 后台在等,用 Thread.Sleep()
  • 千万别在主线程 Sleep。

http://www.dtcms.com/a/478498.html

相关文章:

  • 从智能补全到云原生适配:免费IDE DataGrip的技术实践与行业趋势
  • 多摄像头网络压力测试
  • 信息发布网站设计巴中网站建设有限公司
  • 图像处理-opencv(一)
  • 空包网站分站怎么做重庆市工程建筑造价信息网
  • 基于MATLAB的Excel文件批量读取与循环处理
  • 网站建设方案拓扑图平面设计现在怎么样
  • 高并发下的优雅延迟:Python异步爬虫(aiohttp)的速率限制实践
  • Python爬虫实战:获取同花顺股票资金流向数据并做分析
  • MyBatis的SpringBootVFS解析
  • 上海网站建设好处自建网站教程
  • 网站建设的作用是什么网站建设沟通准备
  • 【中间件Linux在环境安装】SpringBoot应用环境安装(一)-JDK安装
  • 【Linux环境下安装】SpringBoot应用环境安装(二)-Redis安装
  • 如何设置 Visual Studio 在调试停止时自动关闭控制台
  • 网站建设佰首选金手指三十wordpress 切换中文字体
  • 网站搭建服务器需要多少钱厦门网站建设u
  • MPLS技术详解2:LDP标签分发协议原理与操作流程
  • 网站跟别的做的一样的网站群怎么做
  • java注解+AOP切面:实现sql片段动态插入
  • 网络安全超详细系统教程、渗透测试与学习路线(2025年最新版)
  • 靖江网站制作多少钱网站的衡量标准
  • 一、前置基础(MVC学习前提)_核心特性_【C# 泛型入门】为什么说 List<T>是程序员的 “万能收纳盒“?避坑指南在此
  • OpenCV(十):NumPy中的ROI
  • Qt插件机制实现动态组件加载详解
  • 重大更新!基于VMD+Transformer-BiLSTM-CrossAttention 故障分类模型
  • YOLO系列——基于Ultralytics YOLOv11模型在C++ OpenCV DNN模块进行模型加载与推理(附源码)
  • 有哪些做统计销量的网站设计了网站
  • 做微信公众号的网站有哪些外贸网站建设团队
  • 广东省省考备考(第一百二十二天10.13)——资料分析、言语(强化训练)