BlazorWorker 는 Blazor 에서 Background Service 를 이용해 주기적으로 체크가 필요한 서비스를 만들기 위해
사용되는 라이브러리 입니다.
Timer 를 사용하게되면 화면에서 JavaScript 호출하게되면 Timer 가 멈추는 증상이 발생됩니다.
싱글쓰레드로 동작하기 때문인데 BlazorWorker 는 이를 해결할 수 있게 해줍니다.
https://github.com/Tewr/BlazorWorker
builder.Services.AddWorkerFactory();
using Blazor.BlazorWorkerTest;
using BlazorWorker.Core;
using Microsoft.AspNetCore.Components.Web;
using Microsoft.AspNetCore.Components.WebAssembly.Hosting;
var builder = WebAssemblyHostBuilder.CreateDefault(args);
builder.RootComponents.Add<App>("#app");
builder.RootComponents.Add<HeadOutlet>("head::after");
builder.Services.AddScoped(sp => new HttpClient { BaseAddress = new Uri(builder.HostEnvironment.BaseAddress) });
builder.Services.AddWorkerFactory(); // 추가
await builder.Build().RunAsync();
_Imports.razor 파일에 아래 항목 추가
@using BlazorWorker.BackgroundServiceFactory
@using BlazorWorker.Core
@inject IWorkerFactory workerFactory
Background 로 처리할 Service 를 정의합니다.
public class TestService
{
public int TestMethod()
{
int i = 0;
Console.WriteLine("Starting long running task");
DateTime endTime = DateTime.UtcNow.AddSeconds(10);
while (DateTime.UtcNow < endTime)
{
i++;
Console.WriteLine("Task.Delay(100) - " + i.ToString());
Task.Delay(1000);
}
Console.WriteLine("Finished long running task");
return i;
}
}
위는 단순히 콘솔 창에 로그를 찍는 서비스입니다.
아래처럼 화면에서 사용합니다.
@page "/"
@using Blazor.BlazorWorkerTest.Services
@using BlazorWorker.BackgroundServiceFactory
@using BlazorWorker.Core
@inject IWorkerFactory workerFactory
@inject IJSRuntime JS
<PageTitle>Index</PageTitle>
<button @onclick=OnClick>Do long running</button>
<button @onclick=Alert>Do alert</button>
@code {
public async Task OnClick(EventArgs _)
{
var worker = await workerFactory.CreateAsync();
var service = await worker.CreateBackgroundServiceAsync<TestService>();
var result = await service.RunAsync(s => s.TestMethod());
}
void Alert()
{
JS.InvokeVoidAsync("alert", "test");
}
}
위 코드를 보면 알수 있듯이 버튼 클릭시 TestService 를 등록하여 실행하게됩니다.
TestService 가 동작하여 로그를 찍게되는데 Alert 버튼을 클릭하게되어도 TestService 에 영향이 없음을 알수 있습니다.
C# Blazor Required 항목 Validation 에서 제외하기 (Disable 처리) (0) | 2024.04.18 |
---|---|
C# Blazor JavaScript 함수에서 .NET 메서드 호출하는 방법 (0) | 2024.04.10 |
C# Blazor RadzenButton 의 ButtonType, ButtonStyle (0) | 2024.03.30 |
C# Blazor RadzenDropDown 에 Enum 바인딩하기 (0) | 2024.03.30 |
C# Blazor RadzenGrid 체크박스 추가하기 (0) | 2024.03.30 |