问题
I want to execute a command line tool to process data. It does not need to be blocking. I want it to be low priority. So I wrote the below
Process app = new Process();
app.StartInfo.FileName = @"bin\convert.exe";
app.StartInfo.Arguments = TheArgs;
app.PriorityClass = ProcessPriorityClass.BelowNormal;
app.Start();
However, I get a System.InvalidOperationException
with the message "No process is associated with this object." Why? How do I properly launch this app in low priority?
Without the line app.PriorityClass = ProcessPriorityClass.BelowNormal;
the app runs fine.
回答1:
Try setting the PriorityClass AFTER you start the process. Task Manager works this way, allowing you to set priority on a process that is already running.
回答2:
You can create a process with lower priority by doing a little hack. You lower the parent process priority, create the new process and then revert back to the original process priority:
var parent = Process.GetCurrentProcess();
var original = parent.PriorityClass;
parent.PriorityClass = ProcessPriorityClass.Idle;
var child = Process.Start("cmd.exe");
parent.PriorityClass = original;
child
will have the Idle
process priority right at the start.
回答3:
If you're prepared to P/Invoke to CreateProcess
, you can pass CREATE_SUSPENDED
in the flags. Then you can tweak the process priority before resuming the process.
来源:https://stackoverflow.com/questions/1010370/how-do-i-launch-a-process-with-low-priority-c-sharp