<?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/ar/tags/process-api/</link><description>Articles, tutorials and insights from the .NET community.</description><generator>Hugo</generator><language>ar</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/ar/tags/process-api/index.xml" rel="self" type="application/rss+xml"/><item><title>‎.NET 11 يصلح أخيرًا واجهة برمجة تطبيقات العمليات</title><link>https://thedotnetblog.com/ar/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/ar/news/emiliano-montesdeoca/dotnet-11-process-api-improvements-runandcapturetext/</guid><description>‎System.Diagnostics.Process يحصل على أكبر تحديث له منذ سنوات. ‎RunAndCaptureTextAsync وKillOnParentExit وواجهات SafeProcessHandle API والتحكم الكامل في إعادة توجيه المقابض القياسية — لا مزيد من الكود النمطي للتعامل مع الإغلاق الميت.</description><content:encoded>&lt;p&gt;كل مطور .NET احتاج إلى إطلاق عملية والتقاط مخرجاتها قد كتب نوعًا من الكود النمطي الخطير نفسه: قراءة غير متزامنة من stdout، وقراءة غير متزامنة من stderr، و&lt;code&gt;WaitForExitAsync&lt;/code&gt;، مع عدم نسيان إفراغ كلا التيارين وإلا ستواجه إغلاقًا ميتًا. إنه فخ معروف موجود منذ سنوات.&lt;/p&gt;
&lt;p&gt;‎.NET 11 يصلح هذا أخيرًا بشكل صحيح.&lt;/p&gt;
&lt;h2 id="runandcapturetextasync"&gt;RunAndCaptureTextAsync&lt;/h2&gt;
&lt;p&gt;الإضافة الرئيسية: طريقة ثابتة واحدة تبدأ عملية، وتلتقط stdout وstderr، وتنتظر الإنهاء دون إغلاق ميت.&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;استدعاء واحد. لا إفراغ يدوي للتيارات. لا &lt;code&gt;WaitForExit&lt;/code&gt; موضوع بعناية. إذا كنت تحتاج فقط إلى تشغيل شيء ما والحصول على مخرجاته، فهذه هي واجهة برمجة التطبيقات التي تريدها.&lt;/p&gt;
&lt;p&gt;هناك أيضًا &lt;code&gt;Process.RunAsync&lt;/code&gt; للحالة التي تريد فيها الانتظار حتى الإنهاء دون التقاط المخرجات.&lt;/p&gt;
&lt;h2 id="killonparentexit"&gt;KillOnParentExit&lt;/h2&gt;
&lt;p&gt;مشكلة شائعة مع العمليات المُطلقة: إذا تعطل الوالد أو أُنهي، تستمر العمليات الفرعية في التشغيل كأيتام. يتيح لك &lt;code&gt;KillOnParentExit&lt;/code&gt; الإعلان عند بدء العملية بأن العملية الفرعية يجب إنهاؤها عند إنهاء العملية الوالدة.&lt;/p&gt;
&lt;p&gt;هذه ميزة كانت موجودة بطرق خاصة بالمنصة (كائنات المهام على Windows، وprctl على Linux) لكنها كانت تتطلب p/invoke أو مكتبات طرف ثالث للاستخدام من .NET. الآن أصبحت خاصية من الدرجة الأولى على &lt;code&gt;ProcessStartInfo&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="واجهات-api-المستندة-إلى-safeprocesshandle"&gt;واجهات API المستندة إلى SafeProcessHandle&lt;/h2&gt;
&lt;p&gt;سطح API الخفيف الجديد مبني حول &lt;code&gt;SafeProcessHandle&lt;/code&gt; بدلاً من الفئة &lt;code&gt;Process&lt;/code&gt; الكاملة. الفئة &lt;code&gt;Process&lt;/code&gt; الكاملة تحمل الكثير من الحالة وصعبة التقليص — مسار &lt;code&gt;SafeProcessHandle&lt;/code&gt; أكثر توافقًا مع المُقلِّص للتطبيقات التي تحتاج إلى تصغير حجم المخرجات (WASM، AOT الأصلي).&lt;/p&gt;
&lt;h2 id="تحكم-كامل-في-وراثة-المقابض"&gt;تحكم كامل في وراثة المقابض&lt;/h2&gt;
&lt;p&gt;يضيف التحديث أيضًا تحكمًا دقيقًا في المقابض التي يرثها العملية الفرعية وكيفية إعادة توجيه المقابض القياسية. في السابق كان بإمكانك إعادة توجيه stdin/stdout/stderr لكن لم يكن بإمكانك تحديد المقابض التي ترث بالضبط على مستوى نظام التشغيل. تعرض واجهات برمجة التطبيقات الجديدة هذا التحكم.&lt;/p&gt;
&lt;h2 id="لماذا-هذا-مهم"&gt;لماذا هذا مهم&lt;/h2&gt;
&lt;p&gt;تُستخدم فئة &lt;code&gt;Process&lt;/code&gt; في الأدوات، وأنظمة البناء، ومشغّلات الاختبارات، وأي تطبيق يستدعي ملفات قابلة للتنفيذ أخرى. كان سطح API القديم يعود إلى .NET Framework وكان يُظهر عمره. هذا ليس تغييرًا كاسرًا للتوافق — واجهات برمجة التطبيقات القديمة لا تزال تعمل — لكن الكود الجديد يجب أن يفضل السطح الجديد.&lt;/p&gt;
&lt;p&gt;للتطبيقات المُقلَّصة أو سيناريوهات الترجمة AOT، يُرحَّب بشكل خاص بمسار &lt;code&gt;SafeProcessHandle&lt;/code&gt;. كانت فئة &lt;code&gt;Process&lt;/code&gt; القديمة تجلب الكثير من الكود كثيف الانعكاسات الذي كان يعقّد التقليص.&lt;/p&gt;
&lt;p&gt;المنشور الأصلي: &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>