using System.Collections.Concurrent;
namespace SKMC.Api.Common.Tasks
{
///
/// TaskToken(任务执行控制令牌)容器
/// 用于管理多个TaskToken相关的线程执行暂停、恢复、停止
///
public class TaskTokener
{
private static readonly ConcurrentDictionary taskTokens = new ConcurrentDictionary();
///
/// 创建一个TaskToken
///
/// TaskToken的Id
public static TaskToken Add(int id)
{
if (taskTokens.ContainsKey(id))
{
taskTokens.TryRemove(id, out var taskTokenGet);
taskTokenGet?.Cancel();
};
TaskToken taskTokenNew = new TaskToken { Id = id };
bool result = taskTokens.TryAdd(id, taskTokenNew);
if (result) return taskTokenNew;
return null;
}
///
/// 重新创建所有的TaskToken
///
public static void AddAll()
{
foreach (int stationId in taskTokens.Keys)
{
TaskToken taskToken = GetTaskToken(stationId);
if (taskToken == null) continue;
Add(stationId);
}
}
///
/// 根据Id获取TaskToken
///
/// TaskToken的Id
///
public static TaskToken GetTaskToken(int id)
{
if (!taskTokens.ContainsKey(id))
{
Add(id);
}
return taskTokens[id];
}
///
/// 设置TaskToken中断点(在Stop之前有效)
///
///
public static void SetWaitPoint(int id) => SetWaitPoint(GetTaskToken(id));
///
/// 设置TaskToken中断点(在Stop之前有效)
///
///
public static void SetWaitPoint(TaskToken taskToken)
{
if (taskToken == null) return;
taskToken.SetWaitPoint();
}
///
/// TaskToken是否已取消/停止
///
///
///
public static bool IsCancelled(int id) => IsCancelled(GetTaskToken(id));
///
/// TaskToken是否已取消/停止
///
///
///
public static bool IsCancelled(TaskToken taskToken)
{
if (taskToken == null) return true;
return taskToken.IsCancelled();
}
///
/// 暂停TaskToken
///
///
public static void Pause(int id) => Pause(GetTaskToken(id));
///
/// 暂停TaskToken
///
///
public static void Pause(TaskToken taskToken)
{
if (taskToken == null) return;
taskToken.Pause();
}
///
/// 暂停所有的TaskToken
///
public static void PauseAll()
{
foreach (int stationId in taskTokens.Keys)
{
Pause(stationId);
}
}
///
/// 恢复TaskToken
///
///
public static void Resume(int id) => Resume(GetTaskToken(id));
///
/// 恢复TaskToken
///
///
public static void Resume(TaskToken taskToken)
{
if (taskToken == null) return;
taskToken.Resume();
}
///
/// 恢复所有的TaskToken
///
public static void ResumeAll()
{
foreach (int station in taskTokens.Keys)
{
Resume(station);
}
}
///
/// 停止TaskToken
///
///
public static void Stop(int id) => Stop(GetTaskToken(id));
///
/// 停止TaskToken
///
///
public static void Stop(TaskToken taskToken)
{
if (taskToken == null) return;
taskToken.Stop();
//taskTokens.TryRemove(taskToken.Id, out _);
}
///
/// 停止所有的TaskToken
///
public static void StopAll()
{
foreach (int stationId in taskTokens.Keys)
{
Stop(stationId);
}
}
}
}