为什么Thread.Sleep如此有害
我经常看到它提到Thread.Sleep();
不应使用,但我不明白为什么会这样。如果Thread.Sleep();
会引起麻烦,是否有其他相同结果的替代解决方案是安全的?
例如。
while(true){
doSomework();
i++;
Thread.Sleep(5000);
}
另一个是:
while (true){
string[] images = Directory.GetFiles(@"C:\Dir", "*.png");
foreach (string image in images)
{
this.Invoke(() => this.Enabled = true);
pictureBox1.Image = new Bitmap(image);
Thread.Sleep(1000);
}
}
回答:
与调用问题Thread.Sleep
ARE
相当简洁解释在这里:
Thread.Sleep
它的用途:在MTA线程上测试/调试时模拟冗长的操作。在.NET中,没有其他理由使用它。
Thread.Sleep(n)
表示将当前线程阻塞至少n
几毫秒内可能发生的时间片(或线程数量)。在Windows的不同版本/类型和不同的处理器上,时间片的长度是不同的,并且通常在15到30毫秒之间。这意味着几乎可以保证线程阻塞的时间超过
n
毫秒。n
毫秒之后,线程将完全重新唤醒的可能性几乎是不可能的。。
线程是有限的资源,它们大约需要200,000个周期来创建,而销毁大约100,000个周期。默认情况下,它们为其堆栈保留1
MB的虚拟内存,并为每个上下文切换使用2,000-8,000个周期。
首选解决方案:WaitHandles
最错误的做法是使用Thread.Sleep
while构造(演示和答案,不错的博客条目)
编辑:
我想增强我的答案:
我们有2个不同的用例:
1.
我们正在等待,因为我们知道一个特定的时间跨度时,我们应该继续(使用
Thread.Sleep
,System.Threading.Timer
或相似者)
- 我们正在等待,因为某些条件会改变一段时间…关键字会 !如果条件检查在我们的代码域中,则应使用WaitHandles-
否则,外部组件应提供某种类型的钩子……如果不是,则其设计不好!
我的回答主要涵盖用例2
以上是 为什么Thread.Sleep如此有害 的全部内容, 来源链接: utcz.com/qa/430981.html