2017-02-25 99 views
-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(); 

谁能告诉我如何解决这个问题?

+0

你每秒调用'Process.GetProcesses()'多少次? – MickyD

+0

@MickyD这是可配置的,通常每秒一次。但我需要同时运行多个(现在3个)线程,执行不同的操作。 – Tim

+0

也许发布你的一些代码? – MickyD

回答

-1

我在MSDN论坛中发现了另一个解决方案。

也许获得Process对象,然后使用WaitForExit。或者将EnableRaisingEvents设置为true并处理Exited事件。那么你不需要周期性循环。

相关问题