Table of Contents
- One-Liner Process Execution
- Deadlock-Free Output Capture
- Enhanced Control Over Process Lifetimes
- Lightweight Process Handle API
- Other Notable Improvements
The System.Diagnostics.Process class has long been the cornerstone for creating and interacting with processes in .NET. With .NET 11, Microsoft has delivered the most significant update to this API in years. The new features simplify common tasks, eliminate tricky race conditions, and provide fine-grained control over how processes are started, managed, and terminated—all while improving performance and reducing memory usage.

One-Liner Process Execution
Starting a process and capturing its output often required several lines of code and careful handling of asynchronous events. .NET 11 introduces two new static methods that streamline this into a single call:
- Process.RunAndCaptureText[Async] – Launch a process and immediately capture both standard output and standard error, then wait for the process to exit. No more manually wiring up event handlers or worrying about deadlocks.
- Process.Run[Async] – A simpler variant for when you don't need the output. It starts the process and waits for its exit without capturing anything.
- Process.StartAndForget – For fire-and-forget scenarios, this method starts the process, returns its PID, and releases all .NET resources right away. The child process continues running independently.
Deadlock-Free Output Capture
One of the oldest pitfalls in process management is a deadlock caused by filling the pipe buffer between stdout and stderr. .NET 11's new API sidesteps this entirely:
- Process.ReadAllText, ReadAllBytes, ReadAllLines and their async counterparts – These methods read both standard output and standard error simultaneously using multiplexing. You get all the data without the risk of pipe buffer deadlocks, and the API automatically handles the order of reads to prevent blocking.
Enhanced Control Over Process Lifetimes
Managing the lifecycle of child processes has always been tricky, especially when you want to ensure cleanup or separation. .NET 11 introduces several new ProcessStartInfo properties that give you explicit control:
Redirect to Anything
The new StandardInputHandle, StandardOutputHandle, and StandardErrorHandle properties let you redirect standard handles to any SafeFileHandle—be it a file, a pipe, or even null to discard output. Combined with File.OpenNullHandle(), you can easily ignore unwanted streams.
Controlled Handle Inheritance
By default, child processes inherit all inheritable handles from the parent. The new InheritedHandles property lets you specify exactly which handles a child process should inherit, preventing accidental leaks and improving security.
Kill on Parent Exit
Set KillOnParentExit to true to ensure that the child process is automatically terminated when the parent process exits. This works on both Windows and Linux, helping you clean up orphaned processes.
Detached Processes
Conversely, the StartDetached property allows you to start a process that will survive the termination of its parent. Your child process continues running even if the parent is killed, the terminal closes, or a signal is sent.

Lightweight Process Handle API
For scenarios where you need minimal overhead—especially in NativeAOT or trimming-heavy applications—.NET 11 introduces SafeProcessHandle. This struct provides a trimmer-friendly, lower-level API for starting and managing processes without instantiating a full Process object:
- SafeProcessHandle.Start – Launch a process and get a lightweight handle.
- SafeProcessHandle.WaitForExit – Wait for the process to exit.
- SafeProcessHandle.Kill – Terminate the process.
- SafeProcessHandle.Signal – Send a signal (especially useful on Unix).
This API can reduce NativeAOT binary sizes by up to 32% compared to .NET 10 when using SafeProcessHandle instead of Process.
Process Exit Details
The new ProcessExitStatus struct provides detailed exit information: the exit code, the terminating signal (on Unix), and a flag indicating whether the process was killed due to a timeout or cancellation.
Other Notable Improvements
Beyond the headline features, .NET 11 brings several under‑the‑hood enhancements:
- Better scalability on Windows:
BeginOutputReadLineandBeginErrorReadLineno longer block thread pool threads. This significantly improves throughput when starting many processes with redirected output in parallel. - Better trimmability: Using the standard
ProcessAPI with trimming can result in NativeAOT binaries that are up to 20% smaller than in .NET 10. - Faster process creation on Apple Silicon: The runtime now uses
posix_spawninternally, resulting in process creation speeds up to 100× faster than before. - Reduced memory allocations across all scenarios.
- New helper APIs:
SafeFileHandle.CreateAnonymousPipecreates connected pipe pairs with optional async support.Console.OpenStandardInput/Output/ErrorHandle()exposes the underlying OS handles for standard streams.SafeFileHandle.Typelets you detect whether a handle is a file, pipe, socket, etc.
With these changes, .NET 11 modernizes process management, making it easier, safer, and faster. Whether you're building command‑line tools, CI pipelines, or complex server applications, the new Process API gives you the control and performance you need.