<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Process API | The .NET Blog</title><link>https://thedotnetblog.com/pl/tags/process-api/</link><description>Articles, tutorials and insights from the .NET community.</description><generator>Hugo</generator><language>pl</language><managingEditor>@thedotnetblog (The .NET Blog)</managingEditor><webMaster>@thedotnetblog</webMaster><lastBuildDate>Tue, 26 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://thedotnetblog.com/pl/tags/process-api/index.xml" rel="self" type="application/rss+xml"/><item><title>.NET 11 w końcu naprawia API Procesów</title><link>https://thedotnetblog.com/pl/news/emiliano-montesdeoca/dotnet-11-process-api-improvements-runandcapturetext/</link><pubDate>Tue, 26 May 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/pl/news/emiliano-montesdeoca/dotnet-11-process-api-improvements-runandcapturetext/</guid><description>System.Diagnostics.Process otrzymuje największą aktualizację od lat. RunAndCaptureTextAsync, KillOnParentExit, API SafeProcessHandle i pełna kontrola nad przekierowaniem standardowych uchwytów — koniec z powtarzającym się kodem obsługi deadlocka.</description><content:encoded>&lt;p&gt;Każdy deweloper .NET, który kiedykolwiek musiał uruchomić proces i przechwycić jego wynik, napisał jakąś wariację tego samego niebezpiecznego powtarzającego się kodu: asynchroniczny odczyt z stdout, asynchroniczny odczyt z stderr, &lt;code&gt;WaitForExitAsync&lt;/code&gt;, nie zapomnij opróżnić obu strumieni, albo dostaniesz deadlock. To dobrze znana pułapka, która istnieje od lat.&lt;/p&gt;
&lt;p&gt;.NET 11 w końcu naprawia to porządnie.&lt;/p&gt;
&lt;h2 id="runandcapturetextasync"&gt;RunAndCaptureTextAsync&lt;/h2&gt;
&lt;p&gt;Kluczowe dodanie: jedna statyczna metoda, która uruchamia proces, przechwytuje stdout i stderr, i czeka na zakończenie bez deadlocka.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;Process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RunAndCaptureTextAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;dotnet&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;--version&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StandardOutput&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Jedno wywołanie. Bez ręcznego opróżniania strumieni. Bez ostrożnie umieszczonego &lt;code&gt;WaitForExit&lt;/code&gt;. Jeśli po prostu chcesz uruchomić coś i uzyskać wynik, to jest właśnie to API, którego szukasz.&lt;/p&gt;
&lt;p&gt;Jest też &lt;code&gt;Process.RunAsync&lt;/code&gt; dla przypadku, gdy chcesz czekać na zakończenie bez przechwytywania danych wyjściowych.&lt;/p&gt;
&lt;h2 id="killonparentexit"&gt;KillOnParentExit&lt;/h2&gt;
&lt;p&gt;Częsty problem z uruchamianymi procesami: jeśli proces nadrzędny ulega awarii lub zostaje zabity, procesy potomne nadal działają jako sieroty. &lt;code&gt;KillOnParentExit&lt;/code&gt; pozwala zadeklarować przy uruchamianiu procesu, że proces potomny powinien zostać zakończony, gdy zakończy się proces nadrzędny.&lt;/p&gt;
&lt;p&gt;Ta funkcja istniała w specyficznych dla platformy formach (obiekty zadań w Windows, prctl w Linux), ale wymagała p/invoke lub bibliotek zewnętrznych do użycia z .NET. Teraz jest właściwością pierwszej klasy w &lt;code&gt;ProcessStartInfo&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="api-oparte-na-safeprocesshandle"&gt;API oparte na SafeProcessHandle&lt;/h2&gt;
&lt;p&gt;Nowa lekka powierzchnia API jest zbudowana wokół &lt;code&gt;SafeProcessHandle&lt;/code&gt;, a nie pełnej klasy &lt;code&gt;Process&lt;/code&gt;. Pełna klasa &lt;code&gt;Process&lt;/code&gt; niesie ze sobą dużo stanu i trudno ją przycinać — ścieżka &lt;code&gt;SafeProcessHandle&lt;/code&gt; jest bardziej przyjazna dla trimmera w aplikacjach, które muszą minimalizować rozmiar wyjścia (WASM, natywne AOT).&lt;/p&gt;
&lt;h2 id="pełna-kontrola-nad-dziedziczeniem-uchwytów"&gt;Pełna Kontrola nad Dziedziczeniem Uchwytów&lt;/h2&gt;
&lt;p&gt;Aktualizacja dodaje również szczegółową kontrolę nad tym, które uchwyty dziedziczy proces potomny i jak są przekierowywane standardowe uchwyty. Wcześniej można było przekierowywać stdin/stdout/stderr, ale nie można było określić dokładnie, które uchwyty dziedziczyć na poziomie systemu operacyjnego. Nowe API udostępniają tę kontrolę.&lt;/p&gt;
&lt;h2 id="dlaczego-to-jest-ważne"&gt;Dlaczego To Jest Ważne&lt;/h2&gt;
&lt;p&gt;Klasa &lt;code&gt;Process&lt;/code&gt; jest używana w toolingu, systemach budowania, uruchomieniach testów i każdej aplikacji, która wywołuje inne pliki wykonywalne. Stara powierzchnia API pochodzi z epoki .NET Framework i pokazywała swój wiek. Nie jest to zmiana łamiąca kompatybilność — stare API nadal działają — ale nowy kod powinien preferować nową powierzchnię.&lt;/p&gt;
&lt;p&gt;W przypadku przycinanych aplikacji lub scenariuszy kompilacji AOT, ścieżka &lt;code&gt;SafeProcessHandle&lt;/code&gt; jest szczególnie mile widziana. Stara klasa &lt;code&gt;Process&lt;/code&gt; przynosiła dużo kodu z ciężkimi odwołaniami refleksji, który komplikował przycinanie.&lt;/p&gt;
&lt;p&gt;Oryginalny post: &lt;a href="https://devblogs.microsoft.com/dotnet/process-api-improvements-in-dotnet-11/"&gt;Process API Improvements in .NET 11&lt;/a&gt;&lt;/p&gt;</content:encoded></item></channel></rss>