50 lines
1.3 KiB
C#
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();
|
|
}
|
|
|
|
|
|
}
|