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 已实现的结果处理事件,例如 ProgressChangedRunWorkerCompleted。如果你使用它们,那么你可以自己实现从你的线程中触发类似的事件。

【讨论】:

以上是关于BackgroundWorker 中的 Thread.Sleep(0) [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何使 Backgroundworker 中的进程在 Cancellation Pending 事件中退出

c# 关于backgroundWorker的取消

将 'BackgroundWorker' 替换为 'Thread'

BackgroundWorker UI不会更新Windows Phone 7中的进度

简单多线程BackgroundWorker

使用 BackgroundWorker 关闭模态窗口