using System.Collections.Concurrent; using Serein.NodeFlow; using Serein.NodeFlow.Model; namespace Serein.NodeFlow.Tool { public class TcsSignalException : Exception { public FlowStateType FsState { get; set; } public TcsSignalException(string? message) : base(message) { FsState = FlowStateType.Error; } } public class TcsSignal where TSignal : struct, Enum { //public ConcurrentDictionary>> TcsEvent { get; } = new(); public ConcurrentDictionary> TcsEvent { get; } = new(); public ConcurrentDictionary TcsValue { get; } = new(); /// /// 触发信号 /// /// /// 信号 /// 传递的参数 /// 是否成功触发 public bool TriggerSignal(TSignal signal, T value) { if (TcsEvent.TryRemove(signal, out var waitTcs)) { waitTcs.SetResult(value); return true; } return false; } public TaskCompletionSource CreateTcs(TSignal signal) { var tcs = TcsEvent.GetOrAdd(signal,_ = new TaskCompletionSource()); return tcs; } public void CancelTask() { lock (TcsEvent) { foreach (var tcs in TcsEvent.Values) { tcs.SetException(new TcsSignalException("任务取消")); } TcsEvent.Clear(); } } } }