قوائم المهام لـ C# (.NET): من البسيط إلى المعقد
نادرًا ما تخلو التطويرات الحديثة بلغة C# (.NET) من المهام الخلفية والمعالجة المؤجلة والعمليات غير المتزامنة. قوائم المهام (Job Queues / Message Queues) هي نمط أساسي يسمح بتخفيف الحمل عن الخيط الرئيسي للتطبيق، وضمان تسليم الرسائل، وتوسيع نطاق المعالجة. في هذه المقالة، سنستعرض ثلاث طرق شائعة لتنفيذ قوائم المهام في .NET: System.Threading.Channels المدمج، والمجدول القوي Hangfire، ووسيط الرسائل الصناعي RabbitMQ مع عميل .NET.
1. System.Threading.Channels — قائمة مهام مدمجة في .NET
System.Threading.Channels هي قائمة مهام خفيفة الوزن وآمنة للخيوط، متاحة مباشرة في .NET (بدءًا من .NET Core 2.1). وهي مثالية لسيناريوهات "المنتج-المستهلك" داخل عملية واحدة.
الإمكانيات الرئيسية:
- القراءة والكتابة غير المتزامنة (
await writer.WriteAsync()،await reader.ReadAsync()). - قنوات محدودة وغير محدودة (Bounded / Unbounded).
- دعم الإلغاء عبر
CancellationToken. - القراءة المجمعة (
ReadAllAsync).
مثال: قائمة مهام بسيطة
using System.Threading.Channels;
// إنشاء قناة بسعة 100 عنصرvar channel = Channel.CreateBounded<string>(100);
// المنتج: إضافة المهامvar producer = Task.Run(async () =>{ for (int i = 0; i < 10; i++) { await channel.Writer.WriteAsync($"المهمة {i}"); await Task.Delay(100); } channel.Writer.Complete(); // إشارة الانتهاء});
// المستهلك: معالجة المهامvar consumer = Task.Run(async () =>{ await foreach (var item in channel.Reader.ReadAllAsync()) { Console.WriteLine($"تمت المعالجة: {item}"); }});
await Task.WhenAll(producer, consumer);المزايا: لا تبعيات، أداء عالٍ، مثالي لقوائم المهام في الذاكرة داخل تطبيق واحد.
العيوب: غير مناسب للأنظمة الموزعة — تُفقد البيانات عند إعادة التشغيل.
2. Hangfire — مجدول متقدم للمهام الخلفية
Hangfire هي مكتبة شائعة لـ .NET لا تنفذ قائمة المهام فحسب، بل توفر أيضًا لوحة تحكم ويب، واستمرارية (SQL Server، Redis، PostgreSQL)، وإعادة محاولات، وجداول زمنية CRON.
الإمكانيات الرئيسية:
- التشغيل والإهمال (Fire-and-forget) (تشغيل لمرة واحدة).
- المهام المؤجلة (Delayed).
- المهام المتكررة (Recurring) — بديل لـ Windows Task Scheduler.
- إعادة محاولات تلقائية بسياسة قابلة للتخصيص.
- مراقبة مدمجة (لوحة تحكم).
مثال: الإعداد الأساسي لـ Hangfire
// التثبيت: Install-Package Hangfireusing Hangfire;using Hangfire.SqlServer;
// الإعداد في Program.cs (.NET 6+)var builder = WebApplication.CreateBuilder(args);builder.Services.AddHangfire(config => config.UseSqlServerStorage(builder.Configuration.GetConnectionString("HangfireDb")));builder.Services.AddHangfireServer();
var app = builder.Build();app.UseHangfireDashboard(); // /hangfire
// إضافة المهامBackgroundJob.Enqueue(() => Console.WriteLine("تشغيل وإهمال!"));BackgroundJob.Schedule(() => Console.WriteLine("بعد 5 دقائق"), TimeSpan.FromMinutes(5));RecurringJob.AddOrUpdate("my-job", () => Console.WriteLine("كل دقيقة"), Cron.Minutely);
app.Run();المزايا: وظائف غنية، حفظ الحالة بين عمليات إعادة التشغيل، واجهة مستخدم جاهزة.
العيوب: يتطلب قاعدة بيانات، غير مناسب للأنظمة الموزعة عالية التحميل (مصمم للتطبيقات المتجانسة).
3. RabbitMQ + .NET — قائمة رسائل موزعة
RabbitMQ
أيضاً في المكتبة
توصيات