using Serein.Library.Api;
using System;
using System.Collections.Concurrent;
using System.Threading;
using System.Threading.Channels;
using System.Threading.Tasks;
namespace Serein.Library.Utils
{
///
/// 基于 Channel 的触发器实现
///
///
public class ChannelFlowTrigger : IFlowTrigger
{
// 使用并发字典管理每个枚举信号对应的 Channel
private readonly ConcurrentDictionary>> _channels = new ConcurrentDictionary>>();
///
/// 获取或创建指定信号的 Channel
///
/// 枚举信号标识符
/// 对应的 Channel
private Channel> GetOrCreateChannel(TSignal signal)
{
return _channels.GetOrAdd(signal, _ => Channel.CreateUnbounded>());
}
///
/// 等待信号触发并指定超时时间
///
///
///
///
///
public async Task> WaitTriggerWithTimeoutAsync(TSignal signal, TimeSpan outTime)
{
var channel = GetOrCreateChannel(signal);
var cts = new CancellationTokenSource();
// 异步任务:超时后自动触发信号
_ = Task.Run(async () =>
{
try
{
await Task.Delay(outTime, cts.Token);
var outResult = new TriggerResult