blazor Server 실행시 클래스 백그라운드 구동 문의

안녕하세요. 블레이저를 이용해서 대쉬보드를 만드려합니다.

장비와 소켓 통신을 해야해서 테스트겸 난수발생 클래스를 블레이저 서버 실행시 백그라운드로 실행되게 하려했습니다.

하지만 작동을 안하는건지 Console.log가 기능을 못하는건지 로그가 전혀찍히지 않네요.

단순하게 Program.cs에 넣으면 될지 알았는데… 작동을 안하는거라면 어디에서 클래스를 생성해야 실행이 될까요??

1개의 좋아요

아마 능력자분들께서 더 좋고 상세한 답변 주실 것 같습니다.

만약 Mainapp.Run(); 이후에 코드를 삽입하셨다면 실행이 안될거에요.

아래 테스트 코드 참조 부탁드립니다.

  1. BackgroundClass
public class BackgroundClass
{
    public void Worker()
    {
        int index = 0;

        while (true)
        {
            Console.WriteLine($"Test message {index++}");
            Thread.Sleep(500);
        }
    }
}
  1. Program.Main()
public static void Main(string[] args)
{
    var builder = WebApplication.CreateBuilder(args);

    // Add services to the container.
    builder.Services.AddRazorPages();
    builder.Services.AddServerSideBlazor();

    // Some codes...

    var background = new BackgroundClass();
    Task.Run(background.Worker);

    app.Run();
}

TimedHostedService라는 클래스를 정의하고, BackgroundService를 상속받아 백그라운드 작업을 수행합니다. ExecuteAsync 메서드에서 타이머를 설정하여 5초마다 DoWork 메서드를 호출합니다. StopAsync와 Dispose 메서드에서 타이머를 정리합니다.

using System;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;

public class TimedHostedService : BackgroundService
{
    private readonly ILogger<TimedHostedService> _logger;
    private Timer _timer;

    public TimedHostedService(ILogger<TimedHostedService> logger)
    {
        _logger = logger;
    }

    protected override Task ExecuteAsync(CancellationToken stoppingToken)
    {
        _logger.LogInformation("Timed Hosted Service running.");

        _timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromSeconds(5));

        return Task.CompletedTask;
    }

    private void DoWork(object state)
    {
        _logger.LogInformation("Timed Hosted Service is working.");
    }

    public override Task StopAsync(CancellationToken stoppingToken)
    {
        _logger.LogInformation("Timed Hosted Service is stopping.");

        _timer?.Change(Timeout.Infinite, 0);

        return base.StopAsync(stoppingToken);
    }

    public override void Dispose()
    {
        _timer?.Dispose();
        base.Dispose();
    }
}

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureServices((hostContext, services) =>
            {
                services.AddHostedService<TimedHostedService>();
            });
}
3개의 좋아요

댓글 달고 나서 생각해보니, 좋지 못한 답변이라 생각되었는데 좋은 답변 올려주셔서 고맙습니다!

관련 아티클로 다음 문서가 있습니다. 필요하신 분들은 참조해주시면 좋을 것 같네요.
Background tasks with hosted services in ASP.NET Core | Microsoft Learn

감사합니다~ Task.Run 기억하겠습니다!! 잘작동합니다!!

1개의 좋아요

상속 후 서비스로 올려서 사용하는게 엄청 안정적으로 보입니다. 너무 감사합니다~^^ 다만 Program.cs 에 main 함수가 없어서 알려주신 소스 그대로 두고 빌더 서비스에 호스트만 따로 등록했는데 괜찮은거겠지요?? builder.Services.AddHostedService(); 블레이저는 사용을 거의 안해봐서 …

.net core 6.0 버전부터 main 함수를 생략 할 수 있게 되었습니다.
Main 함수가 암묵적으로 포함되어져 있어서 별도로 main 함수를 추가할 필요가 없어요 Porgram.cs 파일이 애플리케이션 진입점(main) 역할을 한다고 생각하시면 됩니다.