Хотя в самих процессах и потоках нет ничего нового, способ, которым с ними можно взаимодействовать в рамках платформы .NET, довольно прилично изменился (в лучшую сторону). Чтобы проложить себе путь к пониманию приемов построения многопоточных сборок, начнем с того, что посмотрим, каким образом можно взаимодействовать с процессами за счет применения библиотек базовых классов .NET.
В пространстве имен System.Diagnostics поставляется набор типов, которые позволяют программно взаимодействовать с процессами и различными связанными с диагностикой средствами вроде системного журнала событий и счетчиков производительности. Нас интересуют только те типы, которые позволяют взаимодействовать с процессами. Некоторые наиболее важные из них перечислены ниже:
- Process
- Предоставляет доступ к локальным и удаленным процессам, а также позволяет запускать и останавливать процессы программным образом
- ProcessModule
- Представляет модуль (*.dll или *.ехе), который должен загружаться в определенный процесс. Важно понимать, что этот тип может применяться для представления любого модуля — COM, .NET или традиционного двоичного на базе С
- ProcessModuleCollection
- Позволяет создавать строго типизированную коллекцию объектов ProcessModule
- ProcessStartInfо
- Позволяет указывать набор значений, которые должны использоваться при запуске процесса посредством метода Process.Start()
- ProcessThread
- Представляет поток внутри определенного процесса. Следует иметь в виду, что этот тип применяется для диагностики набора потоков в процессе, но не для ответвления внутри него новых потоков
- ProcessThreadCollection
- Позволяет создавать строго типизованную коллекцию объектов ProcessThread
Класс System.Diagnostics.Process позволяет анализировать процессы, которые выполняются на какой-то определенной машине (локальной или удаленной). Кроме того, в нем есть члены, которые позволяют программно запускать и останавливать процессы, просматривать приоритет процесса, а также получать список активных потоков или модулей, которые были загружены в данный процесс. В таблице перечислены некоторые наиболее важные свойства и методы класса System.Diagnostics.Process:
| Свойство или метод | Описание |
| ExitTime | Позволяет извлекать значение даты и времени, ассоциируемое с процессом, который завершил свою работу (и представленное типом DateTime). |
| Handle | Это свойство возвращает дескриптор (представляемый с помощью IntPtr), который был назначен процессу операционной системой. Может оказаться полезным при создании приложений .NET, нуждающихся во взаимодействии с неуправляемым кодом. |
| Id | Позволяет получать идентификатор (PID) соответствующего процесса. |
| MachineName | Позволяет получать имя компьютера, на котором выполняется соответствующий процесс. |
| MainWindowTitle | Позволяет получать заголовок главного окна процесса (если у процесса нет главного окна, возвращается пустая строка). |
| Modules | Позволяет получать доступ к строго типизованной коллекции ProcessModuleCollection, представляющей набор модулей (*.dll или *.ехе), которые были загружены в рамках текущего процесса. |
| ProcessName | Позволяет получать имя процесса (которое совпадает с именем самого приложения). |
| Responding | Позволяет получать значение, показывающее, реагирует ли пользовательский интерфейс соответствующего процесса на действия пользователя (и не находится ли он в текущий момент в “зависшем” состоянии). |
| StartTime | Позволяет получать информацию о том, когда был запущен соответствующий процесс (представленную типом DateTime). |
| Threads | Позволяет получать информацию о том, какие потоки выполняются в рамках соответствующего процесса (в виде коллекции объектов ProcessThread). |
| CloseMainWindow() | Этот метод позволяет завершать процесс, обладающий пользовательским интерфейсом, за счет отправки в его главное окно сообщения о закрытии. |
| GetCurrentProcess() | Этот статический метод возвращает новый объект Process, представляющий процесс, который является активным в текущий момент. |
| GetProcesses() | Этот статический метод возвращает массив новых объектов Process, которые выполняются на текущей машине. |
| Kill() | Этот метод позволяет немедленно останавливать соответствующий процесс. |
| Start() | Этот метод позволяет запускать процесс. |
Давайте рассмотрем пример:
using System;
using System.Linq;
using System.Diagnostics;
namespace ConsoleApplication1
{
class Program
{
static void Main()
{
// Используем LINQ-запрос для получения
// списка всех используемых процессов
var allProcess = from pr in Process.GetProcesses(".")
orderby pr.Id select pr;
int i = 0;
foreach (var proc in allProcess)
{
i++;
string infoproc = string.Format(@"-->{0}:
PID: {1}
Name: {2}
",i,proc.Id,proc.ProcessName);
Console.Write(infoproc);
}
Console.ReadLine();
}
}
}
