Как вызвать событие в HostedService и использовать его в компоненте Blazor? - PullRequest
0 голосов
/ 27 апреля 2020

Я создаю приложение на стороне BlazorServer и пытаюсь обновить один из моих компонентов, когда происходит событие в HostedService.

Проблема решена! Проверьте комментарии к решению.

Вот как я пытаюсь это сделать:

Конфигурация в Startup.cs:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddRazorPages();
        services.AddServerSideBlazor();
        services.AddSingleton<WeatherForecastService>();
        services.AddHostedService<WeatherForecastService>();
    }

WeatherForecastService:

public class WeatherForecastService : IHostedService
{
    private System.Timers.Timer timer = new System.Timers.Timer(10000);

    public delegate void EventHandler(object sender, EventArgs e);

    public event EventHandler NewWeather;

    private static readonly string[] Summaries = new[]
    {
        "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
    };

    private void TimeOver(object sender, ElapsedEventArgs e)
    {
        NewWeather?.Invoke(this, null);        
    }

    public Task<WeatherForecast[]> GetForecastAsync(DateTime startDate)
    {
        var rng = new Random();
        return Task.FromResult(Enumerable.Range(1, 5).Select(index => new WeatherForecast
        {
            Date = startDate.AddDays(index),
            TemperatureC = rng.Next(-20, 55),
            Summary = Summaries[rng.Next(Summaries.Length)]
        }).ToArray());
    }

    public Task StartAsync(CancellationToken cancellationToken)
    {
        timer.Elapsed += TimeOver;
        timer.AutoReset = true;
        timer.Start();
        return Task.CompletedTask;
    }

    public Task StopAsync(CancellationToken cancellationToken)
    {
        return Task.CompletedTask;
    }
}

FetchData.razor:

@code {
private WeatherForecast[] forecasts;

protected override async Task OnInitializedAsync()
{
    forecasts = await ForecastService.GetForecastAsync(DateTime.Now);
    ForecastService.NewWeather += UpdateWeather;
}

private async void UpdateWeather(object sender, object args)
{
    forecasts = await ForecastService.GetForecastAsync(DateTime.Now);
    StateHasChanged();    
}
}

UpdateWeather () для FetchData.razor никогда не вызывается. Я предполагаю, что компонент FetchData не замечает, что событие запускается из-за некоторой проблемы с потоками. Но я пока не знаю, что с этим делать ...

Ваша помощь приветствуется. С наилучшими пожеланиями

1 Ответ

1 голос
/ 27 апреля 2020

Приведенный выше код генерирует два экземпляра WeatherForecastService!

Решение состоит в том, чтобы изменить регистрацию HostedService с: services.AddHostedService (); to: services.AddHostedService (sp => sp.GetRequiredService ());

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...