namespace Store.Management.Framework.Utilities; /// 按订阅顺序等待异步处理器;异常向调用者传播并停止后续处理。 public sealed class AsyncEvent where TEventArgs : EventArgs { private readonly object _gate = new(); private readonly List> _handlers = []; public void Subscribe(Func callback) { ArgumentNullException.ThrowIfNull(callback); lock (_gate) { _handlers.Add(callback); } } public void Unsubscribe(Func callback) { ArgumentNullException.ThrowIfNull(callback); lock (_gate) { int index = _handlers.LastIndexOf(callback); if (index >= 0) _handlers.RemoveAt(index); } } public async Task InvokeAsync(object? sender, TEventArgs eventArgs) { ArgumentNullException.ThrowIfNull(eventArgs); Func[] snapshot; lock (_gate) { snapshot = _handlers.ToArray(); } foreach (var callback in snapshot) await callback(sender, eventArgs); } }