Язык программирования C#9 и платформа .NET5 - Джепикс Филипп - Страница 271
- Предыдущая
- 271/642
- Следующая
Нетрудно догадаться, что разработчики обычно создают дополнительные потоки для улучшения общей степени отзывчивости программы. Многопоточные процессы обеспечивают иллюзию того, что выполнение многочисленных действий происходит более или менее одновременно. Например, приложение может порождать дополнительный рабочий поток для выполнения трудоемкой единицы работы (вроде вывода на печать крупного текстового файла). После запуска вторичного потока главный поток продолжает реагировать на пользовательский ввод, что дает всему процессу возможность достигать более высокой производительности. Однако на самом деле так происходит не всегда: применение слишком большого количества потоков в одном процессе может приводить к ухудшению производительности из-за того, что центральный процессор должен переключаться между активными потоками внутри процесса (а это отнимает время).
На некоторых машинах многопоточность по большей части является иллюзией, обеспечиваемой операционной системой. Машины с единственным (не поддерживающим гиперпотоки) центральным процессором не обладают возможностью обработки множества потоков в одно и то же время. Взамен один центральный процессор выполняет по одному потоку за единицу времени (называемую квантом времени), частично основываясь на приоритете потока. По истечении выделенного кванта времени выполнение существующего потока приостанавливается, позволяя выполнять работу другому потоку. Чтобы поток не "забывал", что происходило до того, как его выполнение было приостановлено, ему предоставляется возможность записывать данные в локальное хранилище потоков (Thread Local Storage — TLS) и выделяется отдельный стек вызовов (рис. 14.2).

Если тема потоков для вас нова, то не стоит беспокоиться о деталях. На данном этапе просто запомните, что любой поток представляет собой уникальный путь выполнения внутри процесса Windows. Каждый процесс имеет главный поток (созданный посредством точки входа исполняемого файла) и может содержать дополнительные потоки, которые создаются программно.
Взаимодействие с процессами используя платформу .NET Core
Несмотря на то что с процессами и потоками не связано ничего нового, способ взаимодействия с ними в рамках платформы .NET Core значительно изменился (в лучшую сторону). Чтобы подготовить почву для понимания области построения многопоточных сборок (см. главу 15), давайте начнем с выяснения способов взаимодействия с процессами, используя библиотеки базовых классов .NET Core.
В пространстве имен
System.Diagnostics
Класс
System.Diagnostics.ProcessProcessSystem.Diagnostics.Process
Кроме перечисленных выше свойств в классе
System.Diagnostics.Process
Перечисление выполняющихся процессов
Для иллюстрации способа манипулирования объектами
ProcessProcessManipulatorProgramSystem.DiagnosticsSystem.Linqstatic void ListAllRunningProcesses(){ // Получить все процессы на локальной машине, упорядоченные по PID. var runningProcs = from proc in Process.GetProcesses(".") orderby proc.Id select proc; // Вывести для каждого процесса идентификатор PID и имя. foreach(var p in runningProcs) { string info = $"-> PID: {p.Id}\tName: {p.ProcessName}"; Console.WriteLine(info); } Console.WriteLine("************************************\n");}Статический метод
Process.GetProcesses()Process.Processusing System;using System.Diagnostics;using System.Linq;Console.WriteLine("***** Fun with Processes *****\n");ListAllRunningProcesses();Console.ReadLine();Запустив приложение, вы увидите список имен и идентификаторов PID для всех процессов на локальной машине. Ниже показана часть вывода (ваш вывод наверняка будет отличаться):
***** Fun with Processes *****-> PID: 0 Name: Idle-> PID: 4 Name: System-> PID: 104 Name: Secure System-> PID: 176 Name: Registry- Предыдущая
- 271/642
- Следующая
