创建后台/限制线程

时间:2009-11-02 11:35:23

标签: c# .net multithreading

我正在尝试在“后台”线程中执行长时间运行的代码,而“后台”则意味着低优先级线程而不是.NET后台术语。我创建了一个线程,将其优先级设置为Lowest,如果没有其他线程正在运行,则仍使用100%CPU。当我手动调用Thread.Sleep(1)时,情况有所改善,但我不想更改我的代码并通过Thread.Sleep控制CPU利用率是非常不准确的。

我想要一些执行一段代码的方法,这些代码将被限制以确保CPU使用率为5%-10%。此外,我不想太多地更改代码(这是非常复杂的)。

有可能吗?

3 个答案:

答案 0 :(得分:1)

这听起来有点像你需要解决错误的问题 - 而不是试图将线程限制到设置的CPU使用率(我不确定你能做到),这个线程在做什么有什么问题/它是怎么做的?即,如果它使用100%的CPU,那么你是否可以对该逻辑做些什么来使其首先降低CPU密集度呢?

您可能会发现您可以对其进行返工/优化,以防止它首先成为这种密集型,从而解决根本问题。

更新:使用计时器定期读取外部源。一个很好的参考是here。您将通过不再持续检查这些来源来解决高CPU使用率的根本原因,而是定期进行检查(例如,即使您每15秒执行一次,也会产生巨大差异)

答案 1 :(得分:1)

也许你应该让你的“后台”线程检查一个在高优先级线程工作时设置的共享布尔值,并等到它被取消设置。

答案 2 :(得分:0)

设置线程优先级并不是绝对的事情。它与程序中的其他线程相关。

将线程优先级设置为Normal将意味着它获得处理器时间的相等“份额”(与其他Normal线程相同)。

将优先级设置为低(或最低)意味着与同一程序中的Normal线程相比,它获得的处理器时间更少,并且将其设置为High(或Highest)意味着它会获得更多。

如果只有一个线程,那么无论您设置的优先级如何,它都将获得所需的CPU数量。

正如AdaTheDev所说,如果它使用的是100%CPU,那么问题在于你的算法,而不是Windows如何为线程分配处理器时间。