Рейтинговые книги
Читем онлайн Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 268 269 270 271 272 273 274 275 276 ... 642

-> 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() позволяет получать одиночный объект 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;

  }

  // Вывести статистические сведения по каждому потоку

  // в указанном процессе.

(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})

  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 обеспечивает доступ к классу ProcessThreadCollection. Здесь для каждого потока внутри указанного клиентом процесса выводится назначенный идентификатор потока, время запуска и уровень приоритета. Обновите операторы верхнего уровня в своей программе, чтобы запрашивать у пользователя идентификатор 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:

***** Enter PID of process to investigate *****

PID: 3804

Here 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 тип ProcessThread содержит дополнительные члены, наиболее интересные из которых перечислены в табл. 14.4.

1 ... 268 269 270 271 272 273 274 275 276 ... 642
На этой странице вы можете бесплатно читать книгу Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю бесплатно.
Похожие на Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю книги

Оставить комментарий