diff --git a/Manager.App/Components/Layout/NavMenu.razor b/Manager.App/Components/Layout/NavMenu.razor index 8205a2d..da7f50a 100644 --- a/Manager.App/Components/Layout/NavMenu.razor +++ b/Manager.App/Components/Layout/NavMenu.razor @@ -5,4 +5,5 @@ Library Playlists Development + Services \ No newline at end of file diff --git a/Manager.App/Components/Pages/Services.razor b/Manager.App/Components/Pages/Services.razor new file mode 100644 index 0000000..574a7de --- /dev/null +++ b/Manager.App/Components/Pages/Services.razor @@ -0,0 +1,26 @@ +@page "/Services" +@using Manager.App.Services.System + + +@inject BackgroundServiceManager ServiceManager + +Services + + + + Services + + + + + + + + + + + + + \ No newline at end of file diff --git a/Manager.App/Components/Pages/Services.razor.cs b/Manager.App/Components/Pages/Services.razor.cs new file mode 100644 index 0000000..a28b9bb --- /dev/null +++ b/Manager.App/Components/Pages/Services.razor.cs @@ -0,0 +1,16 @@ +using Manager.App.Services; +using Microsoft.AspNetCore.Components; +using MudBlazor; + +namespace Manager.App.Components.Pages; + +public partial class Services : ComponentBase +{ + private string _searchText = ""; + private List _backgroundServices = []; + + protected override void OnInitialized() + { + _backgroundServices = ServiceManager.GetServices(); + } +} \ No newline at end of file diff --git a/Manager.App/Services/ExtendedBackgroundService.cs b/Manager.App/Services/ExtendedBackgroundService.cs index f2c2b28..a2e3721 100644 --- a/Manager.App/Services/ExtendedBackgroundService.cs +++ b/Manager.App/Services/ExtendedBackgroundService.cs @@ -6,7 +6,7 @@ namespace Manager.App.Services; public abstract class ExtendedBackgroundService : BackgroundService { - private readonly ManualResetEventSlim _resetEvent = new(true); + private TaskCompletionSource _resumeSignal = new(TaskCreationOptions.RunContinuationsAsynchronously); private readonly ILogger _logger; public ServiceState State { get; private set; } = ServiceState.Stopped; public CircularBuffer ProgressLog { get; } = new(500); @@ -24,13 +24,20 @@ public abstract class ExtendedBackgroundService : BackgroundService protected sealed override async Task ExecuteAsync(CancellationToken stoppingToken) { State = ServiceState.Running; - _logger.LogInformation("Starting background service: {ServiceName}", Name); + _logger.LogInformation("Initializing background service: {ServiceName}", Name); + await InitializeAsync(stoppingToken); try { + _logger.LogInformation("Running background service: {ServiceName}", Name); while (!stoppingToken.IsCancellationRequested) { - _resetEvent.Wait(stoppingToken); + if (State == ServiceState.Paused) + { + _resumeSignal = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + await _resumeSignal.Task.WaitAsync(stoppingToken); + } + await Task.Delay(ExecuteInterval, stoppingToken); await ExecuteServiceAsync(stoppingToken); } @@ -57,7 +64,6 @@ public abstract class ExtendedBackgroundService : BackgroundService { if (State == ServiceState.Running) { - _resetEvent.Reset(); State = ServiceState.Paused; _logger.LogInformation("Pauses service: {ServiceName}", Name); } @@ -67,12 +73,13 @@ public abstract class ExtendedBackgroundService : BackgroundService { if (State == ServiceState.Paused) { - _resetEvent.Set(); State = ServiceState.Running; - _logger.LogInformation("Resumes service: {ServiceName}", Name); + _resumeSignal.TrySetResult(); + _logger.LogInformation("Resumed service: {ServiceName}", Name); } } + protected abstract Task InitializeAsync(CancellationToken stoppingToken); protected abstract Task ExecuteServiceAsync(CancellationToken stoppingToken); public override bool Equals(object? obj) diff --git a/Manager.App/Services/System/BackgroundServiceManager.cs b/Manager.App/Services/System/BackgroundServiceManager.cs index de20c8d..0a5db99 100644 --- a/Manager.App/Services/System/BackgroundServiceManager.cs +++ b/Manager.App/Services/System/BackgroundServiceManager.cs @@ -1,5 +1,3 @@ -using Manager.App.Models.System; - namespace Manager.App.Services.System; public class BackgroundServiceManager @@ -11,13 +9,8 @@ public class BackgroundServiceManager _backgroundServices.Add(service); } - public ListResult GetServices(string serviceName, int total = 20, int skip = 0) + public List GetServices() { - var filtered = string.IsNullOrWhiteSpace(serviceName) ? _backgroundServices.ToArray() : _backgroundServices.Where(x => x.Name.Equals(serviceName, StringComparison.OrdinalIgnoreCase)).ToArray(); - - var results = filtered.OrderDescending() - .Skip(skip) - .Take(total); - return new ListResultReturn(results.ToList(), filtered.Length); + return _backgroundServices.ToList(); } } \ No newline at end of file diff --git a/Manager.App/Services/System/ClientService.cs b/Manager.App/Services/System/ClientService.cs index 4537990..f1c1878 100644 --- a/Manager.App/Services/System/ClientService.cs +++ b/Manager.App/Services/System/ClientService.cs @@ -11,14 +11,20 @@ public class ClientService(IServiceScopeFactory scopeFactory, ILogger _clients = []; private CancellationToken _cancellationToken; private ILibraryService? _libraryService; - - protected override async Task ExecuteServiceAsync(CancellationToken stoppingToken) + + protected override async Task InitializeAsync(CancellationToken stoppingToken) { _cancellationToken = stoppingToken; stoppingToken.Register(CancellationRequested); using var scope = scopeFactory.CreateScope(); _libraryService = scope.ServiceProvider.GetRequiredService(); LogProgress("Initializing service..."); + Pause(); + } + + protected override async Task ExecuteServiceAsync(CancellationToken stoppingToken) + { + } private void CancellationRequested()