Язык программирования C#9 и платформа .NET5
-> PID: 908 Name: svchost-> PID: 920 Name: smss-> PID: 1016 Name: csrss-> PID: 1020 Name: NVDisplay.Container-> PID: 1104 Name: wininit-> PID: 1112 Name: csrss************************************Исследование конкретного процесса
В дополнение к полному списку всех выполняющихся процессов на заданной машине статический метод
позволяет получать одиночный объектProcess.GetProcessById()по ассоциированному с ним идентификатору PID. В случае запроса несуществующего PID генерируется исключениеProcess. Например, чтобы получить объектArgumentException, который представляет процесс с PID, равным 30592, можно написать следующий код:Process// Если процесс с PID, равным 30592, не существует,// то сгенерируется исключение во время выполнения.static void GetSpecificProcess(){Process theProc = null;try{theProc = Process.GetProcessById(30592);}catch(ArgumentException ex){Console.WriteLine(ex.Message);}}К настоящему моменту вы уже знаете, как получить список всех процессов, а также специфический процесс на машине посредством поиска по PID. Наряду с выяснением идентификаторов PID и имен процессов класс
позволяет просматривать набор текущих потоков и библиотек, применяемых внутри заданного процесса. Давайте посмотрим, как это делается.ProcessИсследование набора потоков процесса
Набор потоков представлен в виде строго типизованной коллекции
, которая содержит определенное количество отдельных объектовProcessThreadCollection. В целях иллюстрации добавьте к текущему приложению приведенный далее вспомогательный статический метод:ProcessThreadstatic void EnumThreadsForPid(int pID){Process theProc = null;try{theProc = Process.GetProcessById(pID);}catch(ArgumentException ex){Console.WriteLine(ex.Message);return;}// Вывести статистические сведения по каждому потоку// в указанном процессе.Console.WriteLine("Here are the threads used by: {0}", theProc.ProcessName);ProcessThreadCollection theThreads = theProc.Threads;foreach(ProcessThread pt in theThreads){string info =$"-> Thread ID: {pt.Id}\tStart Time:{pt.StartTime.ToShortTimeString()}\tPriority:{pt.PriorityLevel}";Console.WriteLine(info);}Console.WriteLine("************************************\n");}Как видите, свойство
в типеThreadsобеспечивает доступ к классуSystem.Diagnostics.Process. Здесь для каждого потока внутри указанного клиентом процесса выводится назначенный идентификатор потока, время запуска и уровень приоритета. Обновите операторы верхнего уровня в своей программе, чтобы запрашивать у пользователя идентификатор PID процесса, подлежащего исследованию:ProcessThreadCollection...// Запросить у пользователя PID и вывести набор активных потоков.Console.WriteLine("***** Enter PID of process to investigate *****");Console.Write("PID: ");string pID = Console.ReadLine();int theProcID = int.Parse(pID);EnumThreadsForPid(theProcID);Console.ReadLine();После запуска приложения можно вводить PID любого процесса на машине и просматривать имеющиеся внутри него потоки. В следующем выводе показан неполный список потоков, используемых процессом с PID 3804, который (так случилось) обслуживает браузер Edge:
***** Enter PID of process to investigate *****PID: 3804Here are the threads used by: msedge-> Thread ID: 3464 Start Time: 01:20 PM Priority: Normal-> Thread ID: 19420 Start Time: 01:20 PM Priority: Normal-> Thread ID: 17780 Start Time: 01:20 PM Priority: Normal-> Thread ID: 22380 Start Time: 01:20 PM Priority: Normal-> Thread ID: 27580 Start Time: 01:20 PM Priority: -4…************************************Помимо
,IdиStartTimeтипPriorityLevelсодержит дополнительные члены, наиболее интересные из которых перечислены в табл. 14.4.ProcessThread