قوائم المهام لـ 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