Улучшения API процессов в .NET 11. Обзор
Класс System.Diagnostics.Process — это основной способ создания процессов и взаимодействия с ними в .NET. В .NET 11 в него внесли самое масштабное обновление за последние годы. Изменения добавляют высокоуровневые API, которые упрощают запуск процесса и перехват его вывода без взаимоблокировок, предоставляют полный контроль над наследованием дескрипторов и стандартным перенаправлением дескрипторов, вводят функции управления временем жизни, такие как KillOnParentExit, и включают в себя облегченный API на основе SafeProcessHandle, более удобный для оптимизации. В этой серии постов рассмотрим нововведения подробно.
Новые функции
1. Однострочник для выполнения процесса -
Process.RunAndCaptureText[Async]Запускает процесс, перехватывает вывод/ошибку, ожидает завершения — всё за один вызов.
2. Выполнение без перехвата вывода -
Process.Run[Async]Запускает процесс и ожидает завершения без перехвата вывода.
3. Запустить и забыть -
Process.StartAndForgetЗапускает процесс, возвращает его PID и немедленно освобождает все ресурсы.
4. Перехват вывода без взаимоблокировок -
Process.ReadAllText/Bytes/Lines[Async]Читает stdout и stderr одновременно с использованием мультиплексирования, избегая взаимоблокировок буфера канала.
5. Перенаправление -
ProcessStartInfo.Standard[Input/Output/Error]HandleПеренаправляет стандартные дескрипторы на файлы, каналы, null или любой SafeFileHandle.
6. Контролируемое наследование -
ProcessStartInfo.InheritedHandlesТочно указывает, какие дескрипторы наследуются дочерними процессами, предотвращая случайные утечки памяти.
7. Завершение при выходе родительского процесса -
ProcessStartInfo.KillOnParentExitГарантирует завершение дочерних процессов при выходе родительского процесса (Windows и Linux).
8. Отсоединённые процессы -
ProcessStartInfo.StartDetachedЗапускает процесс, который сохраняется после выхода родительского процесса, сигнала или закрытия терминала.
9. Легковесный дескриптор процесса -
SafeProcessHandle.Start/WaitForExit/Kill/SignalУдобный для сокращения количества процессов низкоуровневый API для запуска и управления процессами без Process.
10. Подробная информация о завершении процесса -
ProcessExitStatusСообщает код завершения, сигнал завершения (Unix) и был ли процесс завершён из-за тайм-аута/отмены.
11. Нулевой дескриптор -
File.OpenNullHandle()Открывает дескриптор, который отбрасывает операции записи и возвращает EOF при чтении.
12. Анонимные каналы -
SafeFileHandle.CreateAnonymousPipeСоздаёт пару подключённых каналов с дополнительной поддержкой асинхронности.
13. Обработчики консоли -
Console.OpenStandard[Input/Output/Error]Handle()Получает базовый дескриптор операционной системы для стандартных потоков.
14. Определение типа дескриптора -
SafeFileHandle.TypeОпределяет, является ли дескриптор файлом, каналом, сокетом и т. д.
Далее рассмотрим новые функции подробнее.
Продолжение следует…
Источник: https://devblogs.microsoft.com/dotnet/process-api-improvements-in-dotnet-11/