BackgroundWorker 中的 Thread.Sleep(0) [重复]
Posted
技术标签:
【中文标题】BackgroundWorker 中的 Thread.Sleep(0) [重复]【英文标题】:Thread.Sleep(0) in BackgroundWorker [duplicate] 【发布时间】:2021-11-03 17:55:31 【问题描述】:在BackgroundWorker
线程中使用Thread.Sleep(0
) 有什么危害吗?有什么好处吗?
我将BackgroundWorker
用于冗长的数据库查询、数据表构建、https Web 查询等。这些任务有时需要五秒钟才能完成。我以为我观察到BackgroundWorker
使 UI 的响应性稍差,但我可能弄错了。所以,我将Thread.Sleep(0)
放在BackgroundWorker
代码中。这真的对我有帮助吗?伤到我了吗?
编辑:我正在尝试使 UI 线程更具响应性。我相信Sleep(0)
会在紧密循环期间为 UI 线程腾出时间,并使 UI 更具响应性,但也许我错了。我不在乎后台任务需要多长时间。
【问题讨论】:
你可以考虑切换到async 如果有的话,它应该会降低性能。 sleep(0) 不可行,只会消耗CPU时间。 @Stefan,我认为OP并不关心调用Sleep(0)
的线程的性能。 OP 正在询问它是否会提高 other 线程的性能。 Documentation for the Thread class暗示Sleep(0)
等价于Yield()
,所以问题就相当于问Thread.Yield()
是否会提升其他线程的性能。
它在同一个 CPU 上运行对吧?不太可能,但甚至可能是同一个核心。我试图指出它主要是浪费资源。此外,如果您需要此类措施,则表明正在发生一些可疑的事情。我建议听从克劳斯的建议。
我正在尝试使 UI 线程更具响应性。我相信 Sleep(0) 会为 UI 线程腾出时间并使其更具响应性,但也许我错了。
【参考方案1】:
好处?不,这只是对stop on 0 milliseconds
的刺伤。也许,动态更改延迟很有用。但我不知道有什么用处。
伤害?不大,只需几条操作系统指令即可停止并继续运行。没有结果,但做了一些额外的工作。
BackgroundWorker 的定义是用于不应阻塞 UI 的繁重/长任务(阻塞元素、用单一颜色填充表单……)。那个
反应稍差
行为来自后台的繁重任务。您的机器仍然具有应该在所有线程和任务之间共享的相同 OS/RAM/CPU。如果您的机器没有可用资源,那么现有的资源将及时共享。一种推动现有公司的额外大玩家。
更新。正如Solomon Slow 所注意到的那样,Sleep(0) 等效于 Yeld()(将执行传递给准备好在当前处理器上运行的另一个线程)。所以它可能会减慢您的 BG 进程,使其工作时间更长。
编辑更新。让后台进程(另一个线程)已经解锁了你的 UI。要进一步分离这些线程 - 您可以尝试线程的 Priority
属性:https://docs.microsoft.com/en-us/dotnet/api/system.threading.thread.priority。
例如,在您的后台线程分配一个ThreadPriority.BelowNormal
值,而您的主线程将拥有它ThreadPriority.Normal
。
顺便说一句,BackgroundWorker 没有这样的字段或控件。它与您的 UI 具有相同的优先级。如果您需要这种优先级控制 - 将其替换为 new Thread(...)
。
更改将丢弃 BackgroundWorker 已实现的结果处理事件,例如 ProgressChanged
、RunWorkerCompleted
。如果你使用它们,那么你可以自己实现从你的线程中触发类似的事件。
【讨论】:
以上是关于BackgroundWorker 中的 Thread.Sleep(0) [重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何使 Backgroundworker 中的进程在 Cancellation Pending 事件中退出
将 'BackgroundWorker' 替换为 'Thread'