强制不同的线程休眠

时间:2009-06-29 12:55:33

标签: c# .net multithreading sleep

所以我有一个程序,可以作为其他程序的“shell”。在它的核心,它传递一个类,一个方法名称和一些args,并处理函数的执行,其想法是允许其他程序员基本上安排他们的进程在这个shell服务上运行。除了一个问题,一切正常。通常,这些计划执行的进程非常耗费CPU。有时,进程调用开始使用如此多的CPU,我负责检查计划和启动其他作业的线程没有机会运行相当长的一段时间,导致调度问题和缺乏足够的反应能力。不幸的是,我无法在实际运行的代码中插入Thread.Sleep()调用,因为我并不真正“拥有”它。

所以我的问题是:是否有可能强制一个任意线程(我开始)经常睡眠(产生),而不修改在该线程中运行的实际代码?除此之外,有没有办法将Thread.Sleep()调用“注入”我将要在运行时动态运行的代码?

5 个答案:

答案 0 :(得分:10)

不是真的。您可以尝试使用Priority属性更改其他线程的优先级,但是您无法真正注入“睡眠”调用。

Thread.Suspend()强烈建议您不要使用它。您实际上并不希望让其他线程在任意时间挂起,因为它可能拥有重要的资源。 (这就是为什么这个方法被标记为过时并且周围有各种各样的警告:)

降低其他任务的优先级并可能提升自己任务的优先级可能是最佳方法。

答案 1 :(得分:4)

不存在(据我所知),您可以更改线程的调度优先级 - http://msdn.microsoft.com/en-us/library/system.threading.thread.priority.aspx

在启动线程时降低运行问题代码的线程的优先级(或提高调度线程的优先级)

答案 2 :(得分:1)

您可以暂停使用Thread.Suspend的帖子(已弃用且不推荐),也可以通过更改Thread.Priority来降低其优先级。

答案 3 :(得分:0)

实际上,您所说的是一个非常大的安全风险,因此大多数平台都不会支持它。在未经您许可的情况下允许其他程序影响您的状态通常不是一个好的政策。

如果可能的话,您可以在您自己的代码中创建自己的进程中加载​​有问题的编程,然后您可以设置该进程的优先级或使其休眠,或者您有什么。我不是Windows编程的专家,所以你的里程可能会有所不同。

答案 4 :(得分:0)

你不应该这样做。线程不应该睡眠()除非他们自己认为这是个好主意。

无论如何,这与你的问题无关。您的问题显然是由于CPU不足而导致管理线程无法运行。要解决这个问题,为这些线程提供更高的优先级就足够了。在每个时间片结束时,操作系统将确定下一个应运行的线程。线程优先级有点动态:没有运行一段时间的线程将相对于刚刚运行的threas向上移动。但是管理线程的基本线程优先级越高,就意味着他们不需要这种动态提升来进行调度。

如果仍然不够,请降低工作线程的优先级。这意味着工作线程在获得新的时间片之前必须休眠更长时间。

最后,确保启动新工作线程的线程以非常低的优先级运行。这意味着如果系统达到CPU限制,则不会创建新线程。这实现了一种简单但强大的限制机制。