Background Services در .NET
سرویسی که مستقل از درخواستهای HTTP و در پسزمینه برنامه اجرا میشود، مناسب کارهای زمانبندیشده و Queue.
چرا مهم است؟
بسیاری از کارهای واقعی برنامه (ارسال ایمیل، پردازش Queue، پاکسازی داده) نباید داخل یک Request HTTP انجام شوند — Background Service این کار را درست انجام میدهد.
Background Service چیست؟
سرویسی که در پسزمینه (Background) اجرا میشود و مستقل از درخواستهای HTTP کار میکند.
موارد استفاده
ارسال ایمیل · پردازش Queue · زمانبندی Jobها · پاکسازی دادههای قدیمی · همگامسازی اطلاعات با سرویسهای دیگر · Health Check و مانیتورینگ
روشهای پیادهسازی
۱. IHostedService — پایهترین اینترفیس برای ساخت Background Service، با متدهای StartAsync() و StopAsync(). مناسب برای Jobهای ساده یا اجرای عملیات هنگام Start/Shutdown.
۲. BackgroundService — کلاس آمادهای که از IHostedService ارثبری میکند؛ فقط کافی است متد زیر را پیادهسازی کنید:
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
// ...
await Task.Delay(TimeSpan.FromMinutes(1), stoppingToken);
}
}
مناسب برای: حلقههای طولانی (Loop) · Worker Service · پردازش Queue
ثبت در DI
builder.Services.AddHostedService<MyWorker>();
توقف سرویس
همیشه از CancellationToken برای توقف ایمن (Graceful Shutdown) استفاده کنید.
تأخیر بین اجراها
بهجای Thread.Sleep() از await Task.Delay(...) استفاده کنید — چون Thread.Sleep بلاک میکند و Async نیست.
تفاوت IHostedService و BackgroundService
| IHostedService | BackgroundService | |
|---|---|---|
| پیادهسازی | کنترل بیشتر | سادهتر |
| چه متدهایی لازم است | StartAsync() و StopAsync() |
فقط ExecuteAsync() |
| مناسب | Jobهای ساده | Workerهای طولانی |
بهترین روشها
از Dependency Injection استفاده کنید · عملیات طولانی را Async بنویسید · Exceptionها را Log کنید · از CancellationToken پشتیبانی کنید · از ایجاد Loop بدون Delay خودداری کنید
نکته کلیدی: Background Service بدون وابستگی به درخواست HTTP در پسزمینه برنامه اجرا میشود؛ میتوان چند Background Service را در یک برنامه، مستقل از هم و همزمان، از طریق AddHostedService ثبت کرد.
خلاصه
- Background Service مستقل از HTTP Pipeline و در پسزمینه اجرا میشود.
- BackgroundService سادهترین راه پیادهسازی است؛ فقط ExecuteAsync را بنویسید.
- همیشه از CancellationToken برای توقف ایمن و Task.Delay بهجای Thread.Sleep استفاده کنید.
