· · 2 دقائق قراءة

‎.NET 11 يصلح أخيرًا واجهة برمجة تطبيقات العمليات

‎System.Diagnostics.Process يحصل على أكبر تحديث له منذ سنوات. ‎RunAndCaptureTextAsync وKillOnParentExit وواجهات SafeProcessHandle API والتحكم الكامل في إعادة توجيه المقابض القياسية — لا مزيد من الكود النمطي للتعامل مع الإغلاق الميت.

.NET .NET 11 Performance Process API
هذا المقال متاح أيضاً بـ:English, Català, Español, Deutsch, Français, Português, Italiano, 日本語, 中文, 한국어, Русский, हिन्दी, Polski, Türkçe, Bahasa Indonesia, Nederlands

كل مطور .NET احتاج إلى إطلاق عملية والتقاط مخرجاتها قد كتب نوعًا من الكود النمطي الخطير نفسه: قراءة غير متزامنة من stdout، وقراءة غير متزامنة من stderr، وWaitForExitAsync، مع عدم نسيان إفراغ كلا التيارين وإلا ستواجه إغلاقًا ميتًا. إنه فخ معروف موجود منذ سنوات.

‎.NET 11 يصلح هذا أخيرًا بشكل صحيح.

RunAndCaptureTextAsync

الإضافة الرئيسية: طريقة ثابتة واحدة تبدأ عملية، وتلتقط stdout وstderr، وتنتظر الإنهاء دون إغلاق ميت.

var result = await Process.RunAndCaptureTextAsync("dotnet", "--version");
Console.WriteLine(result.StandardOutput);

استدعاء واحد. لا إفراغ يدوي للتيارات. لا WaitForExit موضوع بعناية. إذا كنت تحتاج فقط إلى تشغيل شيء ما والحصول على مخرجاته، فهذه هي واجهة برمجة التطبيقات التي تريدها.

هناك أيضًا Process.RunAsync للحالة التي تريد فيها الانتظار حتى الإنهاء دون التقاط المخرجات.

KillOnParentExit

مشكلة شائعة مع العمليات المُطلقة: إذا تعطل الوالد أو أُنهي، تستمر العمليات الفرعية في التشغيل كأيتام. يتيح لك KillOnParentExit الإعلان عند بدء العملية بأن العملية الفرعية يجب إنهاؤها عند إنهاء العملية الوالدة.

هذه ميزة كانت موجودة بطرق خاصة بالمنصة (كائنات المهام على Windows، وprctl على Linux) لكنها كانت تتطلب p/invoke أو مكتبات طرف ثالث للاستخدام من .NET. الآن أصبحت خاصية من الدرجة الأولى على ProcessStartInfo.

واجهات API المستندة إلى SafeProcessHandle

سطح API الخفيف الجديد مبني حول SafeProcessHandle بدلاً من الفئة Process الكاملة. الفئة Process الكاملة تحمل الكثير من الحالة وصعبة التقليص — مسار SafeProcessHandle أكثر توافقًا مع المُقلِّص للتطبيقات التي تحتاج إلى تصغير حجم المخرجات (WASM، AOT الأصلي).

تحكم كامل في وراثة المقابض

يضيف التحديث أيضًا تحكمًا دقيقًا في المقابض التي يرثها العملية الفرعية وكيفية إعادة توجيه المقابض القياسية. في السابق كان بإمكانك إعادة توجيه stdin/stdout/stderr لكن لم يكن بإمكانك تحديد المقابض التي ترث بالضبط على مستوى نظام التشغيل. تعرض واجهات برمجة التطبيقات الجديدة هذا التحكم.

لماذا هذا مهم

تُستخدم فئة Process في الأدوات، وأنظمة البناء، ومشغّلات الاختبارات، وأي تطبيق يستدعي ملفات قابلة للتنفيذ أخرى. كان سطح API القديم يعود إلى .NET Framework وكان يُظهر عمره. هذا ليس تغييرًا كاسرًا للتوافق — واجهات برمجة التطبيقات القديمة لا تزال تعمل — لكن الكود الجديد يجب أن يفضل السطح الجديد.

للتطبيقات المُقلَّصة أو سيناريوهات الترجمة AOT، يُرحَّب بشكل خاص بمسار SafeProcessHandle. كانت فئة Process القديمة تجلب الكثير من الكود كثيف الانعكاسات الذي كان يعقّد التقليص.

المنشور الأصلي: Process API Improvements in .NET 11

شارك:
عرض الكود المصدري لهذا المقال على GitHub ↗
← .NET 11 Preview 4: قالب خادم MCP، مكتبات Runtime-Async، واجهة برمجة العمليات
dotnet new WinUI: إنشاء تطبيقات Windows دون الحاجة إلى Visual Studio →