قوائم المهام في C# (.NET): نظرة عامة على المكتبات والتطبيقات

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

قوائم المهام لـ C# (.NET): من البدائيات الأساسية إلى الحلول الصناعية



تنظيم المعالجة غير المتزامنة للمهام هي إحدى المهام الرئيسية عند تطوير التطبيقات عالية التحميل بلغة C#. في نظام .NET البيئي، توجد عدة طرق: من بدائيات التزامن المدمجة إلى مكتبات خارجية قوية. في هذه المقالة، سنستعرض الأدوات الأساسية للعمل مع قوائم المهام، ونقاط قوتها وأمثلة على الاستخدام.



1. System.Threading.Channels — أداة .NET المدمجة



بدءًا من .NET Core 2.1، ظهرت الفئة System.Threading.Channels.Channel<T> في المكتبة القياسية. وهي قائمة انتظار آمنة للخيوط، محسّنة لسيناريوهات المنتج-المستهلك (producer-consumer).



الإمكانيات الأساسية:

  • القراءة والكتابة غير المتزامنة (WriteAsync, ReadAsync)
  • دعم قوائم الانتظار المحدودة وغير المحدودة
  • إمكانية إنهاء قائمة الانتظار للإشارة إلى المستهلكين
  • أداء عالٍ بدون أقفال


مثال على الاستخدام:

using System.Threading.Channels;

var channel = Channel.CreateBounded<string>(100);

// المنتجvar producer = Task.Run(async () =>{ for (int i = 0; i < 10; i++) { await channel.Writer.WriteAsync($"Task {i}"); await Task.Delay(100); } channel.Writer.Complete();});

// المستهلكvar consumer = Task.Run(async () =>{ await foreach (var item in channel.Reader.ReadAllAsync()) { Console.WriteLine($"Processing: {item}"); await Task.Delay(200); }});

await Task.WhenAll(producer, consumer);


متى تستخدم: لقوائم الانتظار الداخلية في عملية واحدة، عندما لا تكون هناك حاجة إلى الثبات أو المعالجة الموزعة.



2. Hangfire — مكتبة متقدمة للمهام الخلفية



Hangfire هي واحدة من أشهر المكتبات لإدارة المهام الخلفية في .NET. وهي تدعم قوائم الانتظار، الجدولة، إعادة المحاولة والمراقبة.



الميزات الرئيسية:

  • الثبات (SQL Server، Redis، PostgreSQL وغيرها)
  • واجهة ويب للمراقبة
  • دعم المهام المؤجلة والمتكررة
  • إعادة محاولة تلقائية عند الفشل


مثال على الإعداد والاستخدام:

// التثبيت: Install-Package Hangfire// في Startup.cspublic void ConfigureServices(IServiceCollection services){    services.AddHangfire(config =>        config.UseSqlServerStorage(connectionString));    services.AddHangfireServer();}

// الاستخدامpublic class EmailService{ public void SendWelcomeEmail(int userId) { // منطق إرسال البريد الإلكتروني Console.WriteLine($"Sending email to user {userId}"); }}

// وضع مهمة في قائمة الانتظارBackgroundJob.Enqueue<EmailService>(x => x.SendWelcomeEmail(42));

// مهمة مؤجلةBackgroundJob.Schedule<EmailService>( x => x.SendWelcomeEmail(43), TimeSpan.FromMinutes(5));


متى تستخدم: لتطبيقات الويب التي تتطلب حفظ المهام بين عمليات إعادة التشغيل، والمراقبة والجدولة المرنة.



3. RabbitMQ.Client — قائمة انتظار رسائل موزعة



للأنظمة الموزعة حيث تحتاج عدة خدمات إلى تبادل المهام، يُستخدم RabbitMQ. توفر المكتبة RabbitMQ.Client وصولاً كاملاً إلى بروتوكول AMQP.



مثال أساسي لمنتج-مستهلك:

using RabbitMQ.Client;using System.Text;

// المنتجvar factory = new ConnectionFactory() { HostName = "localhost" };using var connection = factory.CreateConnection();using var channel = connection.CreateModel();

channel.QueueDeclare(queue: "task_queue", durable: true, exclusive

توصيات