using System; using BetterGenshinImpact.Model; using System.Threading; namespace BetterGenshinImpact.Core.Script; public class CancellationContext : Singleton { private readonly object _sync = new(); public CancellationTokenSource Cts { get; private set; } = new(); public bool IsManualStop { get; private set; } public bool IsCancellationRequested { get { lock (_sync) { return !disposed && Cts.IsCancellationRequested; } } } private bool disposed; public void Set() { lock (_sync) { Cts = new CancellationTokenSource(); IsManualStop = false; disposed = false; } } public void ManualCancel() { CancellationTokenSource cts; lock (_sync) { if (disposed) { return; } IsManualStop = true; cts = Cts; } try { cts.Cancel(); } catch (ObjectDisposedException) { // 并发 Clear 可能已释放 CTS,这里视为已取消/已清理。 } } public void Cancel() { CancellationTokenSource cts; lock (_sync) { if (disposed) { return; } cts = Cts; } try { cts.Cancel(); } catch (ObjectDisposedException) { // 并发 Clear 可能已释放 CTS,这里视为已取消/已清理。 } } public void Clear() { CancellationTokenSource cts; lock (_sync) { if (disposed) { return; } cts = Cts; disposed = true; } cts.Dispose(); } }