mirror of
https://github.com/babalae/better-genshin-impact.git
synced 2026-05-25 10:05:49 +08:00
115 lines
2.2 KiB
C#
115 lines
2.2 KiB
C#
using System;
|
||
using BetterGenshinImpact.Model;
|
||
using System.Threading;
|
||
|
||
namespace BetterGenshinImpact.Core.Script;
|
||
|
||
public class CancellationContext : Singleton<CancellationContext>
|
||
{
|
||
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 CancellationToken GetActiveToken()
|
||
{
|
||
lock (_sync)
|
||
{
|
||
if (disposed)
|
||
{
|
||
Cts = new CancellationTokenSource();
|
||
IsManualStop = false;
|
||
disposed = false;
|
||
}
|
||
|
||
return Cts.Token;
|
||
}
|
||
}
|
||
|
||
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();
|
||
}
|
||
}
|