using System; using System.Threading; namespace ScreenConnect; public class RunContext(CancellationToken[] outerCancellationTokens) : IDisposable { private readonly CancellationTokenSource cancellationTokenSource = ((outerCancellationTokens.Length == 0) ? new CancellationTokenSource() : CancellationTokenSource.CreateLinkedTokenSource(outerCancellationTokens)); public bool IsCancellationRequested => cancellationTokenSource.Token.IsCancellationRequested; public RunContext() : this(Extensions.EmptyArray()) { } public virtual void Dispose() { cancellationTokenSource.Dispose(); } public bool Wait(long millisecondsTimeout, long fromMillisecondCount = -1L) { return cancellationTokenSource.Token.WaitHandle.WaitOneSafe(millisecondsTimeout, fromMillisecondCount); } public CancellationToken GetCancellationToken() { return cancellationTokenSource.Token; } public virtual void SignalOutOfBandShutdown() { cancellationTokenSource.TryCancel(); } }