<?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/it/tags/process-api/</link><description>Articles, tutorials and insights from the .NET community.</description><generator>Hugo</generator><language>it</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/it/tags/process-api/index.xml" rel="self" type="application/rss+xml"/><item><title>.NET 11 finalmente risolve l'API dei Processi</title><link>https://thedotnetblog.com/it/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/it/news/emiliano-montesdeoca/dotnet-11-process-api-improvements-runandcapturetext/</guid><description>System.Diagnostics.Process riceve il suo aggiornamento più grande degli ultimi anni. RunAndCaptureTextAsync, KillOnParentExit, API SafeProcessHandle e controllo completo sul reindirizzamento degli handle standard — niente più boilerplate per i deadlock.</description><content:encoded>&lt;p&gt;Ogni sviluppatore .NET che abbia mai avuto bisogno di avviare un processo e catturarne l&amp;rsquo;output ha scritto qualche variante dello stesso pericoloso boilerplate: lettura async da stdout, lettura async da stderr, &lt;code&gt;WaitForExitAsync&lt;/code&gt;, senza dimenticare di svuotare entrambi gli stream altrimenti si va in deadlock. È una trappola ben nota che esiste da anni.&lt;/p&gt;
&lt;p&gt;.NET 11 finalmente la risolve correttamente.&lt;/p&gt;
&lt;h2 id="runandcapturetextasync"&gt;RunAndCaptureTextAsync&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;aggiunta principale: un singolo metodo statico che avvia un processo, cattura stdout e stderr, e attende l&amp;rsquo;uscita senza deadlock.&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;Una sola chiamata. Nessuno svuotamento manuale degli stream. Nessun &lt;code&gt;WaitForExit&lt;/code&gt; posizionato con cura. Se hai solo bisogno di eseguire qualcosa e ottenere il suo output, questa è l&amp;rsquo;API che vuoi.&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;è anche &lt;code&gt;Process.RunAsync&lt;/code&gt; per il caso in cui vuoi aspettare l&amp;rsquo;uscita senza catturare l&amp;rsquo;output.&lt;/p&gt;
&lt;h2 id="killonparentexit"&gt;KillOnParentExit&lt;/h2&gt;
&lt;p&gt;Un problema comune con i processi avviati: se il processo padre si arresta o viene terminato, i processi figli continuano a girare come orfani. &lt;code&gt;KillOnParentExit&lt;/code&gt; ti permette di dichiarare all&amp;rsquo;avvio del processo che il processo figlio deve essere terminato quando il processo padre esce.&lt;/p&gt;
&lt;p&gt;Questa è una funzionalità che esisteva in modi specifici per piattaforma (job objects su Windows, prctl su Linux) ma richiedeva p/invoke o librerie di terze parti per essere usata da .NET. Ora è una proprietà di prima classe su &lt;code&gt;ProcessStartInfo&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="api-basate-su-safeprocesshandle"&gt;API Basate su SafeProcessHandle&lt;/h2&gt;
&lt;p&gt;La nuova superficie API leggera è costruita attorno a &lt;code&gt;SafeProcessHandle&lt;/code&gt; piuttosto che alla classe &lt;code&gt;Process&lt;/code&gt; completa. La classe &lt;code&gt;Process&lt;/code&gt; completa porta molto stato ed è difficile da eliminare — il percorso &lt;code&gt;SafeProcessHandle&lt;/code&gt; è più adatto al trimmer per le applicazioni che devono minimizzare le dimensioni dell&amp;rsquo;output (WASM, AOT nativo).&lt;/p&gt;
&lt;h2 id="controllo-completo-sullereditarietà-degli-handle"&gt;Controllo Completo sull&amp;rsquo;Ereditarietà degli Handle&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;aggiornamento aggiunge anche un controllo granulare su quali handle un processo figlio eredita e come vengono reindirizzati gli handle standard. In precedenza potevi reindirizzare stdin/stdout/stderr ma non potevi specificare esattamente quali handle ereditare a livello di SO. Le nuove API espongono quel controllo.&lt;/p&gt;
&lt;h2 id="perché-è-importante"&gt;Perché È Importante&lt;/h2&gt;
&lt;p&gt;La classe &lt;code&gt;Process&lt;/code&gt; è usata in tooling, sistemi di build, test runner e qualsiasi applicazione che invoca altri eseguibili. La vecchia superficie API risaliva a .NET Framework e mostrava la sua età. Non è un cambiamento che rompe la compatibilità — le vecchie API funzionano ancora — ma il nuovo codice dovrebbe preferire la nuova superficie.&lt;/p&gt;
&lt;p&gt;Per le applicazioni trimmate o gli scenari di compilazione AOT, il percorso &lt;code&gt;SafeProcessHandle&lt;/code&gt; è particolarmente benvenuto. La vecchia classe &lt;code&gt;Process&lt;/code&gt; portava molto codice pesante di reflection che complicava il trimming.&lt;/p&gt;
&lt;p&gt;Post originale: &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>