主题
Events
EventAggregator 双端
命名空间 Events
csharp
public class EventAggregator : IDisposable基于弱引用的事件聚合器,订阅者通过 WeakReference1` 持有以避免内存泄漏。 已释放的订阅者会在下次发布时自动清理。
构造函数
EventAggregator 双端
csharp
public EventAggregator()属性
CaptureCallerStackTrace 双端
csharp
public static bool CaptureCallerStackTrace { get; set; }Determines whether the caller's stack trace should be captured when publishing events. If enabled, a StackTrace will be created and passed to the event exception handlers. This can be useful for debugging or logging purposes but may have a performance impact, as the stack trace will be captured for every event published even if no exceptions occur. Default value is false.
Logger 双端
csharp
public static ILogger? Logger { get; set; }方法
Subscribe 双端
csharp
public virtual void Subscribe<TEvent>(WeakReference<ITrigger> wrTrigger)Unsubscribe 双端
csharp
public virtual void Unsubscribe<TEvent>(WeakReference<ITrigger> wrTrigger)ForgetRun 双端
csharp
public static void ForgetRun(Task task, StackTrace? callerStackTrace)Destroy 双端
csharp
public void Destroy()Dispose 双端
csharp
protected virtual void Dispose(bool disposing)事件
TaskUnhandledException 双端
csharp
public static event TaskUnhandledExceptionEventHandler? TaskUnhandledException字段
eventSubscribers 双端
csharp
protected TypeMap<List<WeakReference<ITrigger>>> eventSubscribersdisposedValue 双端
csharp
protected bool disposedValueIEventSender 双端
命名空间 Events
csharp
public interface IEventSender属性
Aggregator 双端
csharp
public EventAggregator Aggregator { get; }AggregatorWeakReference 双端
csharp
public WeakReference<EventAggregator> AggregatorWeakReference { get; }方法
Publish 双端
csharp
void Publish<TEvent>(TEvent eventToPublish)GetPublisher 双端
csharp
Action<TEvent>? GetPublisher<TEvent>()IEventSenderExtensions 双端
命名空间 Events
csharp
public static class IEventSenderExtensions方法
Publish 双端
csharp
public static void Publish<TEvent>(this IEventSender sender, TEvent eventToPublish)GetPublisher 双端
csharp
public static Action<TEvent>? GetPublisher<TEvent>(this IEventSender sender)Subscribe 双端
csharp
public static Trigger<TEvent> Subscribe<TEvent>(this IEventSender sender, TriggerEventHandle<TEvent> handler, bool keepReference = true) where TEvent : class, ITriggerEvent<TEvent>创建并注册一个触发器,用于订阅指定类型的事件。
sender— 事件发送者,触发器将注册到此对象handler— 事件处理器委托,当事件触发时将调用此委托keepReference— 是否保持对触发器的硬引用以防止被垃圾回收,默认为true
返回: 创建的触发器对象,可用于后续控制(如销毁、禁用等)
备注
此方法是创建和注册触发器的便捷方法,相当于以下代码的简化版本: var trigger = new Trigger<TEvent>(handler, keepReference); trigger.Register(sender); 使用场景: 快速订阅事件,无需手动创建和注册触发器 适用于大多数简单的事件监听场景 避免忘记注册触发器的问题 示例: // 订阅对话完成事件 var trigger = Game.Instance.Subscribe<EventConversationCompleted>(async (sender, e) => { Game.Logger.LogInfo("对话完成: {0}", e.Conversation.Cache.Link.FriendlyName); return true; }); // 需要时可以销毁触发器 trigger.Destroy();
Subscribe 双端
csharp
public static Trigger<TEvent> Subscribe<TEvent>(this IEventSender sender, Func<object, TEvent, Task> handler, bool keepReference = true) where TEvent : class, ITriggerEvent<TEvent>创建并注册一个触发器(简化版,无需返回布尔值)。
sender— 事件发送者,触发器将注册到此对象handler— 事件处理器委托,当事件触发时将调用此委托keepReference— 是否保持对触发器的硬引用以防止被垃圾回收,默认为true
返回: 创建的触发器对象,可用于后续控制(如销毁、禁用等)
ITrigger 双端
命名空间 Events
csharp
public interface ITrigger定义事件触发器的基本接口,用于响应和处理事件系统中的特定事件。 触发器通过弱引用机制管理事件订阅,支持自动垃圾回收和生命周期管理。
备注
触发器是事件系统的核心组件,它们: 订阅来自 IEventSender 的特定事件 在事件发生时异步执行处理逻辑 使用弱引用避免内存泄漏 支持硬引用集合防止意外的垃圾回收
属性
IsValid 双端
csharp
public bool IsValid { get; }获取触发器是否处于有效状态。
备注
当触发器被销毁(调用 Destroy 方法)后,此属性将返回 false。 无效的触发器不会处理任何事件。
IsEnabled 双端
csharp
public bool IsEnabled { get; set; }获取或设置触发器是否启用。
备注
禁用的触发器仍然保持与事件发送者的订阅关系,但不会执行事件处理逻辑。 这提供了一种临时暂停触发器而不需要完全注销的机制。
HardReferences 双端
csharp
protected static HashSet<ITrigger> HardReferences { get; }硬引用集合,用于防止触发器被垃圾回收。
备注
当创建触发器时指定 keepReference 参数为 true,或者需要确保触发器不被意外回收时, 触发器会被添加到此集合中。使用完毕后应调用 Destroy 方法从集合中移除。
方法
Execute 双端
csharp
Task<bool> Execute<TEventCaller>(object sender, TEventCaller eventArgs)异步执行触发器的事件处理逻辑。
sender— 触发事件的发送者对象eventArgs— 事件参数,包含事件的具体数据
返回: 返回一个 Task1,其结果表示事件是否被成功处理: true- 事件处理成功false` - 事件处理失败或事件类型不匹配
AddEvent 双端
csharp
void AddEvent<TEventCaller>(IEventSender sender)向指定的事件发送者注册此触发器,开始监听特定类型的事件。
sender— 事件发送者,触发器将订阅其EventAggregator
备注
此方法已过时,建议使用具体实现类中的 Register 方法。 注册后,当发送者发布指定类型的事件时,此触发器的 Object,``0) 方法将被调用。
RemoveEvent 双端
csharp
void RemoveEvent<TEventCaller>(IEventSender sender)从指定的事件发送者注销此触发器,停止监听特定类型的事件。
sender— 事件发送者,触发器将从其EventAggregator中注销
备注
此方法已过时,建议使用具体实现类中的 Unregister 方法。 注销后,此触发器将不再接收来自该发送者的指定类型事件。
Destroy 双端
csharp
void Destroy()销毁触发器,释放所有资源并从事件系统中完全移除。
备注
此方法将: 从所有已注册的事件发送者中注销触发器 从硬引用集合中移除触发器 清理内部资源和引用 将 IsValid 设置为 false
Events 双端
csharp
IEnumerable<(EventAggregator sender, Type eventType)> Events()获取当前触发器订阅的所有事件发送者和事件类型的集合。
返回: 返回一个包含元组的枚举,每个元组包含: sender - 事件聚合器 EventAggregator eventType - 订阅的事件类型 Type
备注
此方法主要用于调试和监控触发器的订阅状态。 返回的集合只包含仍然有效的(未被垃圾回收的)事件聚合器。
EventsGC 双端
csharp
void EventsGC()执行垃圾回收,清理已失效的弱引用。
备注
此方法会遍历内部存储的弱引用集合,移除那些目标对象已被垃圾回收的弱引用。 定期调用此方法有助于保持触发器的内存效率,防止弱引用集合无限增长。
ITriggerEvent 双端
命名空间 Events
csharp
public interface ITriggerEvent<TSelf> where TSelf : class, ITriggerEvent<TSelf>ITriggerEventToken 双端
命名空间 Events
csharp
public interface ITriggerEventToken<TEvent> where TEvent : class, ITriggerEvent<TEvent>Trigger 双端
命名空间 Events
csharp
public class Trigger<TEvent> : ITrigger, IDisposable where TEvent : class, ITriggerEvent<TEvent>泛型触发器实现,专门处理单一类型的事件,提供高性能的事件处理能力。
备注
Trigger1是针对单一事件类型优化的触发器实现,具有以下特点: 高性能:由于只处理一种事件类型,避免了类型检查和转换的开销 类型安全:编译时确保事件类型的正确性 弱引用管理:自动管理与事件聚合器的弱引用关系 生命周期控制:支持显式的资源释放和垃圾回收 与TriggerDynamic` 相比,此类在性能上更优,但灵活性较低,只能处理指定的单一事件类型。
构造函数
Trigger 双端
csharp
public Trigger(TriggerEventHandle<TEvent> action, bool keepReference = true)初始化 Trigger1` 类的新实例。
action— 事件处理器委托,当事件被触发时将调用此委托。 委托应返回true表示事件处理成功,false表示处理失败。keepReference— 是否在HardReferences集合中保持对此触发器的硬引用, 防止其被垃圾回收。默认为false。
备注
创建触发器后,需要调用 IEventSender) 方法将其注册到相应的事件发送者, 才能开始接收和处理事件。 如果 为 true,触发器将不会被垃圾回收, 直到显式调用 Destroy 方法。这在某些长生命周期的场景中很有用。
Trigger 双端
csharp
public Trigger(Func<object, TEvent, Task> action, bool keepReference = true)初始化 Trigger1` 类的新实例(简化版,无需返回布尔值)。
action— 事件处理器委托,当事件被触发时将调用此委托。keepReference— 是否在HardReferences集合中保持对此触发器的硬引用, 防止其被垃圾回收。默认为true。
属性
IsValid 双端
csharp
public bool IsValid { get; }获取触发器是否处于有效状态。
IsEnabled 双端
csharp
public bool IsEnabled { get; set; }获取或设置触发器是否启用。
方法
Execute 双端
csharp
public Task<bool> Execute(object sender, TEvent eventArgs)执行事件处理逻辑的强类型版本。
sender— 触发事件的发送者对象eventArgs— 类型为 的事件参数
返回: 返回一个 Task1,表示触发器处理的结果: true- 触发器处理成功(通过条件判定)false` - 触发器条件判定失败或触发器被禁用
备注
此方法是 Object,``0) 的强类型版本, 只有当触发器启用(IsEnabled 为 true)时才会执行处理逻辑。
Destroy 双端
csharp
public void Destroy()销毁触发器,释放所有资源。这是 Dispose 的公共包装器。
Events 双端
csharp
public IEnumerable<(EventAggregator sender, Type eventType)> Events()获取当前触发器订阅的事件聚合器和事件类型信息。
返回: 返回包含有效事件聚合器和事件类型的元组集合。 每个元组包含 EventAggregator 实例和 类型。
EventsGC 双端
csharp
public void EventsGC()清理失效的弱引用,释放不再有效的事件聚合器引用。
Dispose 双端
csharp
protected virtual void Dispose(bool disposing)释放触发器使用的托管和非托管资源。
disposing—true表示从Dispose调用;false表示从终结器调用。
AddEvent 双端
csharp
public void AddEvent(IEventSender sender)Register 双端
csharp
public void Register(IEventSender sender)将触发器注册到指定的事件发送者,开始监听事件。
sender— 事件发送者,触发器将订阅其EventAggregator来接收 类型的事件。
备注
注册后,当发送者发布 类型的事件时, 此触发器的 Object,0)` 方法将被异步调用。 可以多次调用此方法将触发器注册到多个事件发送者。 触发器使用弱引用来避免阻止事件发送者被垃圾回收。
RemoveEvent 双端
csharp
public void RemoveEvent(IEventSender sender)Unregister 双端
csharp
public void Unregister(IEventSender sender)从指定的事件发送者注销触发器,停止监听事件。
sender— 要注销的事件发送者,触发器将从其EventAggregator中移除订阅。
备注
注销后,此触发器将不再接收来自该发送者的 类型事件。 如果触发器未注册到此发送者,调用此方法不会产生任何效果。
ToString 双端
csharp
public override string ToString()返回表示当前触发器状态的字符串表示形式。
返回: 包含触发器关键状态信息的字符串,包括事件类型、启用状态、有效性和订阅数量。
备注
此方法主要用于调试和日志记录,提供触发器的快速状态概览。 返回格式:Trigger<EventType>[Status, Subscriptions: count, InHardReferences: bool]
TriggerCompatibilityExtensions 双端
命名空间 Events
csharp
public static class TriggerCompatibilityExtensionsCompatibility shims for trigger-editor generated code.
方法
AddEvent 双端
csharp
public static void AddEvent<TEvent>(this Trigger<TEvent> trigger, IEventSender sender) where TEvent : class, ITriggerEvent<TEvent>Temporary workaround for trigger-editor generated AddEvent<TEvent> calls on Trigger<TEvent>.
TriggerDynamic 双端
命名空间 Events
csharp
public class TriggerDynamic : ITrigger, IDisposable动态触发器实现,支持处理多种不同类型的事件,但相比单一事件触发器有一定的性能开销。
备注
TriggerDynamic 适用于需要处理多种事件类型的场景,具有以下特点: 多事件支持:可以同时订阅和处理多种不同类型的事件 运行时灵活性:可以在运行时动态添加或移除不同类型的事件订阅 性能开销:由于需要支持动态类型,存在一定的性能损耗 类型擦除:使用 dynamic 类型处理事件参数 如果只需要处理单一类型的事件,建议使用 Trigger1` 以获得更好的性能。
构造函数
TriggerDynamic 双端
csharp
public TriggerDynamic(TriggerEventHandle<dynamic> action, bool keepReference = true)初始化 TriggerDynamic 类的新实例。
action— 动态事件处理器委托,接受 dynamic 类型的事件参数。 委托应返回true表示事件处理成功,false表示处理失败。keepReference— 是否在HardReferences集合中保持对此触发器的硬引用, 防止其被垃圾回收。默认为true。
备注
创建动态触发器后,需要使用 IEventSender) 方法 为每种要处理的事件类型进行注册。
TriggerDynamic 双端
csharp
public TriggerDynamic(Func<object, dynamic, Task> action, bool keepReference = true)初始化 TriggerDynamic 类的新实例(简化版,无需返回布尔值)。
action— 动态事件处理器委托,接受 dynamic 类型的事件参数。keepReference— 是否在HardReferences集合中保持对此触发器的硬引用, 防止其被垃圾回收。默认为true。
属性
IsEnabled 双端
csharp
public bool IsEnabled { get; set; }获取或设置触发器是否启用。
IsValid 双端
csharp
public bool IsValid { get; }获取触发器是否处于有效状态。
方法
Execute 双端
csharp
public Task<bool> Execute<TEventCaller>(object sender, TEventCaller eventArgs)执行事件处理逻辑,支持任意类型的事件参数。
sender— 触发事件的发送者对象eventArgs— 事件参数
返回: 返回一个 Task1`,表示事件处理的结果。 如果 为 null,则返回 false。
Destroy 双端
csharp
public void Destroy()销毁触发器,释放所有资源。这是 Dispose 的公共包装器。
Dispose 双端
csharp
protected virtual void Dispose(bool disposing)释放触发器使用的托管和非托管资源。
disposing—true表示从Dispose调用;false表示从终结器调用。
AddEvent 双端
csharp
public void AddEvent<TEventCaller>(IEventSender sender)向指定的事件发送者注册此触发器,开始监听特定类型的事件。
sender— 事件发送者,触发器将订阅其EventAggregator来接收指定类型的事件。
备注
可以多次调用此方法为不同的事件类型进行注册。 每种事件类型都会被单独管理,互不影响。
RemoveEvent 双端
csharp
public void RemoveEvent<TEventCaller>(IEventSender sender)从指定的事件发送者注销此触发器,停止监听特定类型的事件。
sender— 事件发送者,触发器将从其EventAggregator中注销指定类型的事件订阅。
备注
注销后,此触发器将不再接收来自该发送者的指定类型事件。 如果该事件类型的所有订阅都被移除,相关的内部数据结构也会被清理。
Events 双端
csharp
public IEnumerable<(EventAggregator sender, Type eventType)> Events()获取当前触发器订阅的所有事件聚合器和事件类型信息。
返回: 返回包含有效事件聚合器和对应事件类型的元组集合。
EventsGC 双端
csharp
public void EventsGC()清理失效的弱引用,释放不再有效的事件聚合器引用。
备注
此方法会遍历所有事件类型的聚合器集合,移除失效的弱引用。 如果某个事件类型的聚合器集合变为空,该事件类型的记录也会被完全移除。
字段
weakReference 双端
csharp
public WeakReference<ITrigger> weakReference触发器的弱引用,用于在事件聚合器中进行订阅管理。
TriggerEventHandle 双端
命名空间 Events
csharp
public delegate TriggerEventHandle<TEvent>