c# Thread.Sleep 与 Task.Delay 在多线程中的影响

一般在函数执行的时候,如果需要让一个任务等待一会儿在执行,大部分都是采用的Thread.Sleep()语句。

但如果该函数要复用,同时要给函数一个参数,并让该函数被线程调用后并发执行。

当采用如下调用方式的时候,就会出现什么情况呢?就会出现线程阻塞,你会发现只有task1 执行,也即只有一个线程在运行。

复制代码
 1 private  Task task1(int i)
 2         {
 3             while (true)
 4             {
 5                 Thread.Sleep(5000);
 6                 Console.WriteLine(string.Format("task{0} 执行:{1}",i,DateTime.Now));
 7             }
 8         }
 9 
10 private void run()
11         {
12             List<Task> tasks = new List<Task>();
13             Task task3 = task1(1);
14             Task task4 = task1(2);
15             tasks.Add(task3);
16             tasks.Add(task4);
17             Task.WaitAll(tasks.ToArray());
18         }
复制代码

 这么说明,在这里的Thread.Sleep函数造成了阻塞,使得只有一个线程在运行。那如何避免这种情况发生呢。

此时就需要采用Task.Delay(1000),它能够有效避免上述情况发生。将上述Thread.Sleep(5000)改为Task.Delay(5000),别忘了加await ,修改后代码如下:

复制代码
 1     private async Task task1(int i)
 2         {
 3             while (true)
 4             {
 5                 await Task.Delay(5000);
 6                 Console.WriteLine(string.Format("task{0} 执行:{1}",i,DateTime.Now));
 7             }
 8         }
 9 
10  private void run()
11         {
12             List<Task> tasks = new List<Task>();
13             Task task3 = task1(1);
14             Task task4 = task1(2);
15             tasks.Add(task3);
16             tasks.Add(task4);
17             Task.WaitAll(tasks.ToArray());
18         }
复制代码

 改为上面形式就可以并发执行了。

Task.delay 与 Thread.Sleep 区别如下:

1、Thread.Sleep 是同步延迟,Task.Delay异步延迟。

2、Thread.Sleep 会阻塞线程,Task.Delay不会。

3、Thread.Sleep不能取消,Task.Delay可以。

4. Task.Delay() 比 Thread.Sleep() 消耗更多的资源,但是Task.Delay()可用于为方法返回Task类型;或者根据CancellationToken取消标记动态取消等待

5. Task.Delay() 实质创建一个运行给定时间的任务, Thread.Sleep() 使当前线程休眠给定时间。


参考链接: https://blog.csdn.net/zxf347085420/article/details/93347885

 

posted @   扣顶之路  阅读(2495)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示