【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 线程,保持界面响应性。
阅读原文:原文链接