Files
WCS/Cowain.Base/Helpers/BackgroundHostedService.cs
2026-03-02 09:08:20 +08:00

50 lines
1.3 KiB
C#

using Microsoft.Extensions.Hosting;
namespace Cowain.Base.Helpers;
public abstract class BackgroundHostedService : IHostedService, IDisposable
{
private Task? _executeTask;
private CancellationTokenSource? _stoppingCts;
public virtual Task? ExecuteTask => _executeTask;
protected abstract Task ExecuteAsync(CancellationToken stoppingToken);
public virtual Task StartAsync(CancellationToken cancellationToken)
{
_stoppingCts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);
_executeTask = ExecuteAsync(_stoppingCts.Token);
if (_executeTask.IsCompleted)
{
return _executeTask;
}
return Task.CompletedTask;
}
public virtual async Task StopAsync(CancellationToken cancellationToken)
{
if (_executeTask != null)
{
var stoppingCts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);
try
{
stoppingCts.Cancel();
}
finally
{
await _executeTask.WaitAsync(stoppingCts.Token).ConfigureAwait(ConfigureAwaitOptions.SuppressThrowing);
}
}
}
public virtual void Dispose()
{
_stoppingCts?.Cancel();
}
}