【C#】Thread.Sleep和Task.Delay有什么区别
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
1. |
Thread.Sleep | Task.Delay | |
|---|---|---|
| 是否阻塞线程 | ||
| 适用场景 | ||
| 基于 | Task) | |
| 是否释放线程资源 | ||
| 是否支持取消 | CancellationToken | |
| 性能影响 | ||
| UI 应用程序中的影响 |
Thread.Sleep 的使用场景在控制台应用程序中,用于简单的延迟。
在后台线程中执行长时间运行的任务时,用于模拟延迟。
在不关心线程阻塞的场景中。
Task.Delay 的使用场景在 UI 应用程序中,用于异步延迟操作,避免阻塞 UI 线程。
在异步编程中,用于模拟异步操作的延迟。
在需要支持任务取消的场景中(结合 CancellationToken)。
Thread.Sleep 示例void DoWork(){ Console.WriteLine("开始工作"); Thread.Sleep(5000); // 阻塞当前线程 5 秒 Console.WriteLine("工作完成");}
Task.Delay 示例async Task DoWorkAsync(){ Console.WriteLine("开始工作"); await Task.Delay(5000); // 异步等待 5 秒,不会阻塞线程 Console.WriteLine("工作完成");}
Task.Delay 的额外功能Task.Delay 支持 CancellationToken,可以用于取消延迟任务。例如:
async Task DoWorkAsync(CancellationToken cancellationToken){ Console.WriteLine("开始工作"); try { await Task.Delay(5000, cancellationToken); // 支持取消 Console.WriteLine("工作完成"); } catch (TaskCanceledException) { Console.WriteLine("工作被取消"); }}
Thread.Sleep:适用于同步编程,会阻塞当前线程,不适合 UI 应用程序。
Task.Delay:适用于异步编程,不会阻塞线程,适合 UI 应用程序和需要高并发性的场景。
在 WinForms、WPF 或其他 UI 应用程序中,优先使用 Task.Delay,以避免阻塞 UI 线程,保持界面响应性。
阅读原文:原文链接