Files
ThingsGateway/src/Admin/ThingsGateway.Furion/EventBus/Internal/ChannelEventPublisher.cs
2025-07-25 20:20:35 +08:00

130 lines
4.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// ------------------------------------------------------------------------
// 版权信息
// 版权归百小僧及百签科技(广东)有限公司所有。
// 所有权利保留。
// 官方网站https://baiqian.com
//
// 许可证信息
// 项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。
// 许可证的完整文本可以在源代码树根目录中的 LICENSE-APACHE 和 LICENSE-MIT 文件中找到。
// ------------------------------------------------------------------------
namespace ThingsGateway.EventBus;
/// <summary>
/// 基于内存通道事件发布者(默认实现)
/// </summary>
internal sealed partial class ChannelEventPublisher : IEventPublisher
{
/// <summary>
/// 事件处理程序事件
/// </summary>
public event EventHandler<EventHandlerEventArgs> OnExecuted;
/// <summary>
/// 事件源存储器
/// </summary>
private readonly IEventSourceStorer _eventSourceStorer;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="eventSourceStorer">事件源存储器</param>
public ChannelEventPublisher(IEventSourceStorer eventSourceStorer)
{
_eventSourceStorer = eventSourceStorer;
}
/// <summary>
/// 发布一条消息
/// </summary>
/// <param name="eventSource">事件源</param>
/// <returns><see cref="Task"/> 实例</returns>
public async Task PublishAsync(IEventSource eventSource)
{
await _eventSourceStorer.WriteAsync(eventSource, eventSource.CancellationToken).ConfigureAwait(false);
}
/// <summary>
/// 延迟发布一条消息
/// </summary>
/// <param name="eventSource">事件源</param>
/// <param name="delay">延迟数(毫秒)</param>
/// <returns><see cref="Task"/> 实例</returns>
public Task PublishDelayAsync(IEventSource eventSource, long delay)
{
// 创建新线程
Task.Factory.StartNew(async () =>
{
// 延迟 delay 毫秒
await Task.Delay(TimeSpan.FromMilliseconds(delay), eventSource.CancellationToken).ConfigureAwait(false);
await _eventSourceStorer.WriteAsync(eventSource, eventSource.CancellationToken).ConfigureAwait(false);
}, eventSource.CancellationToken, TaskCreationOptions.None, TaskScheduler.Default);
return Task.CompletedTask;
}
/// <summary>
/// 发布一条消息
/// </summary>
/// <param name="eventId">事件 Id</param>
/// <param name="payload">事件承载(携带)数据</param>
/// <param name="cancellationToken"> 取消任务 Token</param>
/// <returns></returns>
public async Task PublishAsync(string eventId, object payload = default, CancellationToken cancellationToken = default)
{
await PublishAsync(new ChannelEventSource(eventId, payload, cancellationToken)).ConfigureAwait(false);
}
/// <summary>
/// 发布一条消息
/// </summary>
/// <param name="eventId">事件 Id</param>
/// <param name="payload">事件承载(携带)数据</param>
/// <param name="cancellationToken"> 取消任务 Token</param>
/// <returns></returns>
public async Task PublishAsync(Enum eventId, object payload = default, CancellationToken cancellationToken = default)
{
await PublishAsync(new ChannelEventSource(eventId, payload, cancellationToken)).ConfigureAwait(false);
}
/// <summary>
/// 延迟发布一条消息
/// </summary>
/// <param name="eventId">事件 Id</param>
/// <param name="delay">延迟数(毫秒)</param>
/// <param name="payload">事件承载(携带)数据</param>
/// <param name="cancellationToken"> 取消任务 Token</param>
/// <returns><see cref="Task"/> 实例</returns>
public async Task PublishDelayAsync(string eventId, long delay, object payload = default, CancellationToken cancellationToken = default)
{
await PublishDelayAsync(new ChannelEventSource(eventId, payload, cancellationToken), delay).ConfigureAwait(false);
}
/// <summary>
/// 延迟发布一条消息
/// </summary>
/// <param name="eventId">事件 Id</param>
/// <param name="delay">延迟数(毫秒)</param>
/// <param name="payload">事件承载(携带)数据</param>
/// <param name="cancellationToken"> 取消任务 Token</param>
/// <returns><see cref="Task"/> 实例</returns>
public async Task PublishDelayAsync(Enum eventId, long delay, object payload = default, CancellationToken cancellationToken = default)
{
await PublishDelayAsync(new ChannelEventSource(eventId, payload, cancellationToken), delay).ConfigureAwait(false);
}
/// <summary>
/// 触发事件处理程序事件
/// </summary>
/// <param name="args">事件参数</param>
public void InvokeEvents(EventHandlerEventArgs args)
{
try
{
OnExecuted?.Invoke(this, args);
}
catch { }
}
}