مدیریت چرخهی حیات پردازشهای پسزمینه در Blazor WebAssembly با معرفی IHostedService در داتنت 11
نویسنده: وحید نصیری
تاریخ: ۱۴۰۵/۰۳/۳۱ ۰۹:۲۵
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
IHostedService وجود داشت که مدیریت اینگونه پردازشها را به عهده میگرفت. مایکروسافت در داتنت 11 با معرفی پشتیبانی از IHostedService در Blazor WebAssembly، این شکاف ساختاری را برطرف کرده و به یکپارچگی و برابری قابلیتها (Feature Parity) در کل اکوسیستم Blazor دست یافته است.IHostedService را پیادهسازی کرده و سرویس خود را در کانتینر تزریق وابستگیها (DI Container) کلاینت ثبت کنید. این سرویس به محض لود شدن و استارت برنامه در مرورگر، متد StartAsync خود را اجرا میکند و تا زمان باز بودن یا بسته شدن برنامه (Shut down)، به کار خود ادامه میدهد.using Microsoft.Extensions.Hosting;
using System;
using System;
using System.Threading;
using System.Threading.Tasks;
namespace BlazorWasmBackgroundService.Services;
public class DataRefreshService : IHostedService
{
private Timer? _timer;
// این متد به محض راهاندازی برنامه در مرورگر فراخوانی میشود
public Task StartAsync(CancellationToken cancellationToken)
{
// تنظیم یک تایمر برای اجرای متد RefreshData هر 5 دقیقه یکبار
_timer = new Timer(RefreshData, null, TimeSpan.Zero, TimeSpan.FromMinutes(5));
return Task.CompletedTask;
}
private void RefreshData(object? state)
{
// عملیات دریافت دادههای جدید از API و بروزرسانی وضعیت برنامه
Console.WriteLine($"[DataRefreshService] دادهها در زمان {DateTime.Now} بروزرسانی شدند.");
}
// این متد هنگام بسته شدن یا از بین رفتن اپلیکیشن اجرا میشود
public Task StopAsync(CancellationToken cancellationToken)
{
_timer?.Dispose();
return Task.CompletedTask;
}
}using Microsoft.AspNetCore.Components.WebAssembly.Hosting; using Microsoft.Extensions.DependencyInjection; using BlazorWasmBackgroundService.Services; var builder = WebAssemblyHostBuilder.CreateDefault(args); // ثبت سرویس پسزمینه در کانتینر خدمات برنامه builder.Services.AddHostedService<DataRefreshService>(); await builder.Build().RunAsync();
IHostedService نباید عملیاتهای سنگین محاسباتی یا پردازشهای مسدودکننده (Blocking) انجام دهند؛ چرا که باعث قفل شدن و کندی رابط کاربری (UI Freezing) میشوند. برای کارهای سنگین محاسباتی، همچنان باید به سراغ تکنولوژیهایی مانند Web Workers رفت.HostedService ثبت میشود، معمولاً دادهها را در یک سرویس Singleton دیگر (مثلاً یک State Container) بروزرسانی میکند. کامپوننتهای Blazor میتوانند به آن سرویس Singleton متصل شده و با گوش دادن به یک رویداد (Event)، پس از هر بار بروزرسانی دادهها توسط سرویس پسزمینه، متد StateHasChanged خود را صدا بزنند تا UI تازه شود.IHostedService در Blazor WebAssembly داتنت 11، ابزاری استاندارد، تمیز و مبتنی بر چرخهی حیات (Lifecycle-aware) را در اختیار توسعهدهندگان فرانتاند قرار میدهد. این ویژگی نیاز به راهحلهای غیر استاندارد را از بین برده و ساختار کدنویسی کلاینت و سرور را بیش از پیش به یکدیگر نزدیک میکند. با رعایت اصل عدم مسدودسازی نخ اصلی مرورگر، این قابلیت کنترل فوقالعادهای روی فرآیندهای دورهای و پسزمینه در برنامههای مدرن WebAssembly فراهم میسازد.