728x90
주기적으로 체크해야 할 것이 있는 경우 Timer 등으로 돌리게 되는데 이는 Java Script 호출 시 중단이 됩니다.
싱글스레드로 동작하기 때문에 다른 작업에 영향을 주는 것입니다.
이를 BalzorWorker를 이용하면 Background로 실행되어 Java Script를 호출해도 중단되지 않고 동작하게 됩니다.
https://github.com/Tewr/BlazorWorker
여기에 나온 데로 Nuget 설치 후 builder.Services.AddWorkerFactory(); 해주고
사용할 화면에
@using BlazorWorker.BackgroundServiceFactory
@using BlazorWorker.Core
@inject IWorkerFactory workerFactory
위 내용을 넣어주고 사용합니다.
먼저 Background로 처리할 Service를 만듭니다.
TestService.cs
namespace Blazor.BlazorWorkerTest.Services
{
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;
}
}
}
화면에서 아래처럼 사용합니다. (가이드대로 처리함)
Index.razor
@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");
}
}
실행해 보면 출력창에 찍히는 서비스가 Alert 버튼을 눌러도 alert 창이 떠도 중단 없이 실행되는 걸 확인할 수 있습니다.
* 좀더 다듬은 예제로 다시 만들어서 포스팅하겠습니다.
[Source]
https://github.com/kei-soft/Blazor.AppTest/tree/master/Blazor.BlazorWorkerTest
728x90
'C# > Blazor' 카테고리의 다른 글
[Blazor] toast 메세지 표시하기 (0) | 2022.12.30 |
---|---|
[Blazor] Required 항목 Disable 처리하기 (0) | 2022.12.29 |
[Blazor] [참고] BlazorWorker (0) | 2022.12.27 |
[Blazor] EditContext 를 이용한 Validation 처리 (0) | 2022.12.27 |
[Blazor] enum 값 표시하기 (0) | 2022.12.27 |