Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 强制另一个线程睡眠_C#_.net_Multithreading_Sleep - Fatal编程技术网

C# 强制另一个线程睡眠

C# 强制另一个线程睡眠,c#,.net,multithreading,sleep,C#,.net,Multithreading,Sleep,所以我有一个程序,作为其他程序的“外壳”。它的核心是传递一个类、一个方法名和一些参数,并处理函数的执行,其思想是允许其他程序员基本上安排他们的进程在这个shell服务上运行。除了一个问题外,一切正常。通常,这些计划执行的进程占用大量CPU。有时,名为start的进程占用了太多CPU,以至于负责检查调度和启动其他作业的线程在相当长的一段时间内没有机会运行,从而导致调度问题和缺乏足够的响应能力。不幸的是,我不能在实际运行的代码中插入Thread.Sleep()调用,因为我并不真正拥有它 所以我的问题

所以我有一个程序,作为其他程序的“外壳”。它的核心是传递一个类、一个方法名和一些参数,并处理函数的执行,其思想是允许其他程序员基本上安排他们的进程在这个shell服务上运行。除了一个问题外,一切正常。通常,这些计划执行的进程占用大量CPU。有时,名为start的进程占用了太多CPU,以至于负责检查调度和启动其他作业的线程在相当长的一段时间内没有机会运行,从而导致调度问题和缺乏足够的响应能力。不幸的是,我不能在实际运行的代码中插入Thread.Sleep()调用,因为我并不真正拥有它


所以我的问题是:是否有可能强制任意线程(我开始)每隔一段时间休眠(屈服),而不修改该线程中运行的实际代码?除此之外,是否有某种方法可以将Thread.Sleep()调用“注入”到我将在运行时动态运行的代码中?

不太可能。您可以尝试使用该属性更改另一个线程的优先级,但不能真正注入“sleep”调用

有,但我强烈建议你不要用。您并不想让另一个线程在任意时间挂起,因为它可能包含重要的资源。(这就是为什么该方法被标记为过时,并且周围有各种各样的警告:)

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

没有(据我所知),但是您可以更改线程的调度优先级-


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

您可以使用(已弃用且不推荐)挂起线程,也可以通过更改来降低其优先级。

实际上,你所说的是一个很大的安全风险,因此不会得到大多数平台的支持。未经您允许,允许其他程序影响您的状态通常不是一个好的策略


如果可能的话,您可能会在代码中创建的进程上加载有问题的程序,然后您可以设置该进程的优先级或使其休眠,或者您已经做了什么。我不是windows编程专家,因此您的里程可能会有所不同。

您不应该这样做。线程不应该休眠(),除非它们自己认为这是个好主意

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

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


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

我尝试过干扰优先级,但据我所知,这会影响线程“赢得”下一个可用时间片的可能性,但不会使其自身“产生”时间片的可能性增加/减少。至于资源问题,我认为这是可能的,但这些进程中的每一个都应该是独立的,因为它们都运行在不同的应用程序域中。因此,两个作业需要相同资源的几率应该很低(但不是零)。@Gwlosa:时间片足够小,赢得下一个可用时间片应该足以让调度线程保持响应。你只想让它优先于正在运行的任务,这正是它要做的。不是答案,而是。。。如果您控制所涉及的接口,您可以要求程序调用所提供的委托,在那里您可以临时协同多任务处理(基本上,如果其他进程不足,则休眠)。这完全取决于你不“拥有”代码的程度。