.net 以低优先级运行或设置进程
我正在尝试以低优先级运行进程。但我在ProcessPriorityClass中没有将其设置为低的选项。但如果我转到任务管理器,我可以手动将流程优先级设置为低。那么如何做到这一点呢?下面是我用来将进程设置为低于正常优先级的代码.net 以低优先级运行或设置进程,.net,vb.net,process,.net,Vb.net,Process,我正在尝试以低优先级运行进程。但我在ProcessPriorityClass中没有将其设置为低的选项。但如果我转到任务管理器,我可以手动将流程优先级设置为低。那么如何做到这一点呢?下面是我用来将进程设置为低于正常优先级的代码 Dim s As New Process s.StartInfo.FileName = "D:\myapp.exe" s.Start() s.PriorityClass = ProcessPriorityClass.BelowNormal 我猜ProcessPriorit
Dim s As New Process
s.StartInfo.FileName = "D:\myapp.exe"
s.Start()
s.PriorityClass = ProcessPriorityClass.BelowNormal
我猜
ProcessPriorityClass.Idle
在taskmanager中表示“低”
另请参见:没有“低”值,尽管有ProcessPriorityClass.Idle
由于某种原因,默认taskmanager称之为“低”(大多数其他任务管理器,如ProcessHacker或ProcessExplorer称之为“空闲”,如果你在玩弄流程,你可能会得到一个像样的任务管理器替代品,比如,而不是针对技术含量较低的用户的内置应用程序)
将进程设置为ProcessPriorityClass.Idle
对我来说很好
但需要注意的是:更改进程的优先级级别通常是一个坏主意,尤其是从进程外部更改为空闲(至少在进程内部,您可以决定将某些任务的优先级更改得更高,然后将其重新设置)
如果进程以不可共享的方式获得任何资源,那么设置如此低的优先级可能会导致严重的死锁,因为当任何高优先级进程需要时间片时,它不会运行(特别是在核数较少的机器上,因为同时可用的时间片较少),因此如果高优先级进程也需要资源,它将永远等待获得它,因为低优先级进程将没有机会运行
最终,Windows(虽然不是一些早期版本)将通过临时提升低优先级进程中等待运行的所有线程的优先级,使其高于ThreadPriority.ProcessPriorityClass.High
进程中的最高
线程来解决这一问题,然后逐渐降低优先级,问题再次出现
这可能与您希望发生的情况相反
而且因为它在核心数很少的机器上特别残忍,如果你的开发装备很结实,你的机器上的一切都可以正常工作,然后那些机器不够结实的用户会发现他们的一切都停止了
默认情况下,只有一些中断,“系统空闲进程”(这是一个特例)以空闲状态运行,这是有充分理由的
不过,如果您确信自己知道自己在做什么(或者确实知道自己在做实验),那么s.PriorityClass=ProcessPriorityClass.Idle
就是您想要的
编辑:更多关于优先级的信息:
给定线程相对于进程中的其他线程具有优先级,而给定进程相对于系统上的其他进程具有优先级
一个线程相对于系统上所有其他线程的优先级取决于这两个线程,如下表所示:
Thread: | Idle | Lowest | Below | Normal | Above | Highest | Time-Critical
| | | Normal | | Normal | |
---------------+------+--------+--------+--------+--------+---------+--------------
Idle Process | 1 | 2 | 3 | 4 | 5 | 6 | 15
Below-Normal | 1 | 4 | 5 | 6 | 7 | 8 | 15
Normal Process | 1 | 6 | 7 | 8 | 9 | 10 | 15
Above-Normal | 1 | 8 | 9 | 10 | 11 | 12 | 15
High Process | 1 | 11 | 12 | 13 | 14 | 15 | 15
Realtime | 16 | 22 | 23 | 24 | 25 | 26 | 31
现在,任何给定的计算机都将有X个核,而现在的通用值是1、2、4、8或16。一次只能运行一个核心线程
如果要运行的线程数多于内核数,则按如下方式进行调度: