-2
我开发的功能需要定期扫描正在运行的进程列表,重启退出异常的进程。关于长时间运行的操作系统使用Process.GetProcesses()的性能问题
我使用Process.GetProcesses()
来获取当前正在运行的进程的列表,这在大多数计算机上没有性能问题。
但是,当我部署在长时间运行的服务器上(已运行147天,新的PID已经百万)时,使用Process.GetProcesses()
处理时间高达100毫秒,并且正常Process.GetProcesses()
处理时间在几毫秒。这会影响系统性能。
ProcessesProtectionThread = new Thread(() => {
try {
while (true) {
try {
//I use the Stopwatch, and I found that almost always deal with this line
// of code.
var currentProcesses = Process.GetProcesses();
var protectedProcesses = currentProcesses.Where(item => protectProcessesNames.Contains(item.ProcessName.ToUpper()));
var protectedProcessesPaths = protectedProcesses.Select(item => item?.MainModule?.FileName?.ToUpper()).Distinct().ToList();
var restartProcessesPaths = protectProcessesPaths.Where(item => !protectedProcessesPaths.Contains(item)).ToList();
RestartProcess(restartProcessesPaths, currentProcesses);
}
catch (ThreadAbortException) { }
catch (Exception ex) { LogHelper.WriteExMessage(ex); }
finally { Thread.Sleep(ProcessProtectionInterval); }
}
}
catch (ThreadAbortException) { }
catch (Exception ex) { LogHelper.WriteExMessage(ex); }
});
ProcessesProtectionThread.IsBackground = true;
ProcessesProtectionThread.Start();
谁能告诉我如何解决这个问题?
你每秒调用'Process.GetProcesses()'多少次? – MickyD
@MickyD这是可配置的,通常每秒一次。但我需要同时运行多个(现在3个)线程,执行不同的操作。 – Tim
也许发布你的一些代码? – MickyD