mirror of
https://gitee.com/ThingsGateway/ThingsGateway.git
synced 2025-10-29 06:33:58 +08:00
130 lines
4.9 KiB
C#
130 lines
4.9 KiB
C#
// ------------------------------------------------------------------------
|
||
// 版权信息
|
||
// 版权归百小僧及百签科技(广东)有限公司所有。
|
||
// 所有权利保留。
|
||
// 官方网站: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 { }
|
||
}
|
||
} |