AnotherReplayReader/Utils/CancelManager.cs

49 lines
1.2 KiB
C#

using System;
using System.Threading;
namespace AnotherReplayReader.Utils
{
internal class CancelManager : IDisposable
{
private CancellationToken _linkedToken;
private CancellationTokenSource? _source;
public CancellationToken Token => Materialize().Token;
public void Reset(CancellationToken linked)
{
_linkedToken = linked;
if (_source is { } source)
{
_source = null;
try
{
source.Cancel();
}
catch (AggregateException e)
{
Debug.Instance.DebugMessage += $"Cancellation failed: {e}";
}
source.Dispose();
}
}
public CancellationToken ResetAndGetToken(CancellationToken linked)
{
Reset(linked);
return Token;
}
public void Dispose() => Reset(default);
private CancellationTokenSource Materialize()
{
if (_source is null)
{
_source = CancellationTokenSource.CreateLinkedTokenSource(_linkedToken);
}
return _source;
}
}
}