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