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()