0Pricing
C# Academy · درس

مشاريع Worker Service

أنشئوا Worker Service مستقلًا، واضبطوا DI والتسجيل، وانشروه كخدمة Windows أو daemon على Linux.

مشاريع Worker Service درس مجاني في C# Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C# Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C# Academy 4 دروس في المجموع.

ما خدمة Worker؟

‏Worker Service هو قالب مشروع .NET لإنشاء تطبيقات خلفية طويلة التشغيل، من دون خادم ويب أو نقاط نهاية HTTP. وهو مضيف خفيف الوزن ومناسب لمعالجات قوائم الانتظار والمهام المجدولة والخدمات التي تعمل بأسلوب daemon.

إنشاء Worker Service

استخدم قالب CLI لإنشاء هيكل مشروع Worker Service. إذ ينشئ Program.cs بسيطًا وصنف Worker.cs يرث من BackgroundService.

# Create a new Worker Service project
dotnet new worker -n OrderProcessor

# Generated structure:
# OrderProcessor/
#   Program.cs       — host configuration
#   Worker.cs        — your BackgroundService subclass
#   appsettings.json

ملف Program.cs في Worker Service

يستخدم ملف Program.cs المُنشأ Generic Host. يمكنك من خلاله إعداد DI والتسجيل والإعدادات وتسجيل Worker، تمامًا كما في ASP.NET Core ولكن من دون خادم ويب.

using Microsoft.Extensions.Hosting;

var builder = Host.CreateApplicationBuilder(args);

// Register services
builder.Services.AddDbContext<AppDbContext>(opt =>
    opt.UseSqlServer(builder.Configuration.GetConnectionString("Default")));

builder.Services.AddScoped<IOrderRepository, OrderRepository>();
builder.Services.AddHostedService<OrderProcessorWorker>();

var host = builder.Build();
host.Run();

صنف Worker

ارث من BackgroundService ونفّذ ExecuteAsync. يستدعيه المضيف عند بدء التشغيل ويمرّر رمز إلغاء يتم تفعيله عند الإيقاف.

public class OrderProcessorWorker : BackgroundService
{
    private readonly IServiceScopeFactory _factory;
    private readonly ILogger<OrderProcessorWorker> _logger;

    public OrderProcessorWorker(
        IServiceScopeFactory factory,
        ILogger<OrderProcessorWorker> logger)
    {
        _factory = factory;
        _logger  = logger;
    }

    protected override async Task ExecuteAsync(CancellationToken ct)
    {
        while (!ct.IsCancellationRequested)
        {
            using var scope = _factory.CreateScope();
            var repo = scope.ServiceProvider.GetRequiredService<IOrderRepository>();
            var pending = await repo.GetPendingAsync(ct);
            foreach (var order in pending)
                await ProcessOrderAsync(order, ct);
            await Task.Delay(TimeSpan.FromSeconds(10), ct);
        }
    }

    private Task ProcessOrderAsync(Order o, CancellationToken ct) =>
        Task.Delay(100, ct); // placeholder
}

الإعدادات وDI في Workers

تدعم Worker Services نظام الإعدادات الكامل في .NET، بما في ذلك appsettings ومتغيرات البيئة وأسرار المستخدمين. احقن IConfiguration أو الخيارات محددة النوع.

builder.Services.Configure<WorkerSettings>(
    builder.Configuration.GetSection("Worker"));

public class OrderProcessorWorker : BackgroundService
{
    private readonly WorkerSettings _settings;

    public OrderProcessorWorker(IOptions<WorkerSettings> opts, ...)
        => _settings = opts.Value;

    protected override async Task ExecuteAsync(CancellationToken ct)
    {
        while (!ct.IsCancellationRequested)
        {
            // ...
            await Task.Delay(_settings.PollIntervalSeconds * 1000, ct);
        }
    }
}

التسجيل في Worker Services

يُعد Generic Host نظام التسجيل تلقائيًا. استخدم ILogger<T> للتسجيل المنظّم. وفي بيئة الإنتاج، اضبط Serilog أو Application Insights أو موفّرًا آخر.

// Add Serilog to a Worker Service
builder.Host.UseSerilog((ctx, logConfig) =>
    logConfig
        .ReadFrom.Configuration(ctx.Configuration)
        .WriteTo.Console()
        .WriteTo.Seq(ctx.Configuration["Seq:ServerUrl"]!));

// Structured logging in the worker:
_logger.LogInformation("Processing {Count} orders at {Time}",
    orders.Count, DateTimeOffset.UtcNow);
_logger.LogError(ex, "Failed to process order {OrderId}", order.Id);

التشغيل كخدمة Windows

استخدم UseWindowsService() لتشغيل Worker كخدمة Windows. تبدأ الخدمة وتتوقف مع نظام التشغيل، وتستمر في العمل بعد تسجيل خروج المستخدمين.

// dotnet add package Microsoft.Extensions.Hosting.WindowsServices

builder.Services.AddWindowsService(options =>
    options.ServiceName = "OrderProcessor");

// Build and publish:
// dotnet publish -c Release -o ./publish

// Install as Windows Service:
// sc create OrderProcessor binpath="C:\services\publish\OrderProcessor.exe"
// sc start OrderProcessor

التشغيل كخدمة daemon على Linux باستخدام systemd

استخدم UseSystemd() للتكامل مع systemd على Linux. وتتلقى الخدمة إشارات الإيقاف المناسبة، كما تتكامل مع تسجيل journald.

// dotnet add package Microsoft.Extensions.Hosting.Systemd

builder.Services.AddSystemd();

// Systemd unit file: /etc/systemd/system/orderprocessor.service
// [Unit]
// Description=Order Processor Worker
// [Service]
// Type=notify
// ExecStart=/usr/bin/dotnet /app/OrderProcessor.dll
// Restart=always
// [Install]
// WantedBy=multi-user.target

// Commands:
// sudo systemctl enable orderprocessor
// sudo systemctl start orderprocessor
// sudo journalctl -u orderprocessor -f

التشغيل في Docker

تُعد Worker Services مثالية لحاويات Docker، فلا حاجة إلى تعيين المنافذ؛ ما عليك سوى تشغيل العملية في حلقة حتى تتوقف الحاوية.

# Dockerfile
FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build
WORKDIR /src
COPY . .
RUN dotnet publish -c Release -o /app

FROM mcr.microsoft.com/dotnet/runtime:9.0
WORKDIR /app
COPY --from=build /app .
ENTRYPOINT ["dotnet", "OrderProcessor.dll"]

# docker-compose.yml:
# services:
#   worker:
#     build: .
#     environment:
#       - ConnectionStrings__Default=Server=db;...
#     depends_on: [db]

تطبيق واقعي: Worker للملخصات البريدية

Worker متكامل يرسل ملخصات بريدية يومية من خلال القراءة من قاعدة بيانات وإرسالها عبر خدمة بريد إلكتروني.

public class EmailDigestWorker : BackgroundService
{
    private readonly IServiceScopeFactory _factory;
    private readonly ILogger<EmailDigestWorker> _log;

    protected override async Task ExecuteAsync(CancellationToken ct)
    {
        // Run daily at midnight UTC
        while (!ct.IsCancellationRequested)
        {
            var now = DateTime.UtcNow;
            var next = now.Date.AddDays(1); // next midnight
            await Task.Delay(next - now, ct);

            using var scope = _factory.CreateScope();
            var mailer = scope.ServiceProvider.GetRequiredService<IDigestMailer>();

            try   { await mailer.SendDailyDigestsAsync(ct); }
            catch (Exception ex) { _log.LogError(ex, "Digest failed"); }
        }
    }
}

تحقق سريع

ما الفرق الرئيسي بين مشروع Worker Service ومشروع ASP.NET Core Web API؟

مراجعة: مشاريع Worker Service

أهم النقاط:

  • ‏Worker Service = ‏Generic Host + BackgroundService، من دون خادم ويب
  • دعم كامل لـ DI والتسجيل والإعدادات، ولكن من دون HTTP
  • ‏UseWindowsService() للنشر كخدمة Windows
  • ‏UseSystemd() لخدمة daemon على Linux مع التكامل مع journald
  • انشر داخل حاويات Docker لمعالجة خلفية سحابية أصلية
  • استخدم دائمًا IServiceScopeFactory للتبعيات ذات النطاق Scoped في Worker

الأسئلة الشائعة

هل درس «مشاريع Worker Service» مجاني؟

نعم — نص درس «مشاريع Worker Service» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C# Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C# Academy 4 دروس في المجموع.

ماذا ستتعلم في «مشاريع Worker Service»؟

أنشئوا Worker Service مستقلًا، واضبطوا DI والتسجيل، وانشروه كخدمة Windows أو daemon على Linux. تتمرن على C# Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ C# Academy؟

لا تُشترط خبرة سابقة. C# Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «مشاريع Worker Service»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس C# Academy هذا؟

نعم. كل درس في C# Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. IHostedService وBackgroundService
  2. مشاريع Worker Service
  3. المهام الدورية والمؤقتات
  4. المهام المجدولة في Quartz.NET
← العودة إلى C# Academy