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)
{
if(_channels.TryGetValue(signal, out var channel))
{
return channel;
}
else
{
channel = Channel.CreateUnbounded>();
_channels.AddOrUpdate(signal, _ => channel, (s, r) => channel = r);
return channel;
}
}
///
/// 等待信号触发并指定超时时间
///
///
///
///
///
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