2024-04-06 21:15:26 +02:00
|
|
|
using System.Threading;
|
|
|
|
using Microsoft.Extensions.Hosting;
|
|
|
|
|
|
|
|
namespace TanksServer;
|
|
|
|
|
|
|
|
public class GameTickService(IEnumerable<ITickStep> steps) : IHostedService
|
|
|
|
{
|
|
|
|
private readonly CancellationTokenSource _cancellation = new();
|
|
|
|
private readonly List<ITickStep> _steps = steps.ToList();
|
|
|
|
private Task? _run;
|
|
|
|
|
|
|
|
public Task StartAsync(CancellationToken cancellationToken)
|
|
|
|
{
|
|
|
|
_run = RunAsync();
|
|
|
|
return Task.CompletedTask;
|
|
|
|
}
|
|
|
|
|
|
|
|
private async Task RunAsync()
|
|
|
|
{
|
|
|
|
while (!_cancellation.IsCancellationRequested)
|
|
|
|
{
|
|
|
|
foreach (var step in _steps)
|
|
|
|
await step.TickAsync();
|
2024-04-07 00:33:54 +02:00
|
|
|
await Task.Delay(1000);
|
2024-04-06 21:15:26 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public async Task StopAsync(CancellationToken cancellationToken)
|
|
|
|
{
|
|
|
|
await _cancellation.CancelAsync();
|
|
|
|
if (_run != null) await _run;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public interface ITickStep
|
|
|
|
{
|
|
|
|
Task TickAsync();
|
|
|
|
}
|