В дополнение к полному списку всех выполняющихся процессов на заданной машине статический метод
Process.GetProcessById
позволяет получать одиночный объект
Process
по ассоциированному с ним идентификатору PID. В случае запроса несуществующего PID генерируется исключение
ArgumentException
. Например, чтобы получить объект
Process
, который представляет процесс с PID, равным 30592, можно написать следующий код:
//
Если процесс с PID, равным 30592, не существует,
// то сгенерируется исключение во время выполнения.
static void GetSpecificProcess
{
Process theProc = null;
try
{
theProc = Process.GetProcessById(30592);
}
catch(ArgumentException ex)
{
Console.WriteLine(ex.Message);
}
}
К настоящему моменту вы уже знаете, как получить список всех процессов, а также специфический процесс на машине посредством поиска по PID. Наряду с выяснением идентификаторов PID и имен процессов класс
Process
позволяет просматривать набор текущих потоков и библиотек, применяемых внутри заданного процесса. Давайте посмотрим, как это делается.
Исследование набора потоков процесса
Набор потоков представлен в виде строго типизованной коллекции
ProcessThreadCollection
, которая содержит определенное количество отдельных объектов
ProcessThread
. В целях иллюстрации добавьте к текущему приложению приведенный далее вспомогательный статический метод:
static 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);
.
Здесь для каждого потока внутри указанного клиентом процесса выводится назначенный идентификатор потока, время запуска и уровень приоритета. Обновите операторы верхнего уровня в своей программе, чтобы запрашивать у пользователя идентификатор PID процесса, подлежащего исследованию:
...
// Запросить у пользователя 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:
содержит дополнительные члены, наиболее интересные из которых перечислены в табл. 14.4.
Прежде чем двигаться дальше, необходимо уяснить, что тип
ProcessThread
не является сущностью, применяемой для создания, приостановки или уничтожения потоков на платформе .NET Core. Тип
ProcessThread
скорее представляет собой средство, позволяющее получать диагностическую информацию по активным потокам Windows внутри выполняющегося процесса. Более подробные сведения о том, как создавать многопоточные приложения с использованием пространства имен
System.Threading
, приводятся в главе 15.
Исследование набора модулей процесса
Теперь давайте посмотрим, как реализовать проход по загруженным модулям, которые размещены внутри конкретного процесса. Когда речь идет о процессах, модуль — это общий термин, применяемый для описания заданной сборки
*.dll
(или самого файла
*.ехе
), которая обслуживается специфичным процессом. Когда производится доступ к коллекции
ProcessModuleCollection
через свойство
Process.Modules
, появляется возможность перечисления всех модулей, размещенных внутри процесса: библиотек на основе .NET Core, СОМ и традиционного языка С. Взгляните на показанный ниже дополнительный вспомогательный метод, который будет перечислять модули в процессе с указанным идентификатором PID: