【发布时间】:2013-06-07 20:59:36
【问题描述】:
首先,我问的问题与C# - Alternative to Thread.Sleep? 或Alternative to Thread.Sleep in C#? 不同。我认为我没有错误地使用它并且需要针对特定情况的真正替代品。
在代码分析运行期间,我看到了一个令人惊讶的违规行为:
使用 Thread.Sleep() 是设计缺陷的标志。
此违规行为导致 Peter Richie's article 了解这究竟为何构成不良设计。
我们都知道线程创建是昂贵的,线程阻塞意味着池上的争用。我们也知道每个线程将分配一个兆的内存,所以它应该有很短的生命周期,在 UI 上阻塞是邪恶的,使用睡眠来计时是不可靠的等等等等等等。这让我明白了,如果你真的需要执行一个睡眠,如果不是 Thread.Sleep,你应该使用什么?
Peter 继续提到零睡眠是 Thread.Sleep 的唯一正确使用,它有效地放弃了线程的时间片并允许其他线程进行处理。然后更可怕的是,这只是因为对非托管线程的限制,如果在 CLR 中重新实现,将产生在应用程序中使用 Thread.Sleep 的副作用。事实上,所有关于常见错误用法的要点都是错误用法的好例子。
我在使用 Thread.Sleep 非常成功的生产代码中有以下情况:
- 等待操作系统释放文件锁定(发现文件锁定问题,等待一秒钟,再试一次,稍后放弃)。
- 杀死一个进程并等待它不在进程列表中显示(杀死它,检查它没有运行,等待一秒钟,检查它没有运行,强制关闭)。
- 等待复制缓冲区刷新(检查文件大小,尝试访问它,等待,检查大小是否已更改)。
如果在这种情况下不使用 Thread.Sleep,我还有哪些其他选择?紧密的循环往往会使事情变得更糟,我不认为这会使其使用成为“设计缺陷”,尤其是因为 UI 上没有任何内容,并且仅在后台线程中。软件的本质就是在多线程环境中等待其他事情,外部因素会影响你的代码,有时你需要等待......
【问题讨论】:
-
你想说什么,Thread.Sleep是不可避免的?然后使用它。但我从不想使用它。
-
虽然 Peter 的文章有很多优点,但不能原谅它完全错误的事实。
标签: c# multithreading wait thread-sleep