728x90
728x170

주기적으로 체크해야 할 것이 있는 경우 Timer 등으로 돌리게 되는데 이는 Java Script 호출 시 중단이 됩니다.
싱글스레드로 동작하기 때문에 다른 작업에 영향을 주는 것입니다.

이를 BalzorWorker를 이용하면 Background로 실행되어 Java Script를 호출해도 중단되지 않고 동작하게 됩니다.

https://github.com/Tewr/BlazorWorker

 

GitHub - Tewr/BlazorWorker: Library for creating DotNet Web Worker threads/multithreading in Client side Blazor

Library for creating DotNet Web Worker threads/multithreading in Client side Blazor - GitHub - Tewr/BlazorWorker: Library for creating DotNet Web Worker threads/multithreading in Client side Blazor

github.com

여기에 나온 데로 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

 

GitHub - kei-soft/Blazor.AppTest

Contribute to kei-soft/Blazor.AppTest development by creating an account on GitHub.

github.com

 

728x90
그리드형
Posted by kjun
,