Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Linq;
- using System.Threading.Tasks;
- namespace AsynchronousEvent
- {
- public delegate Task AsyncEventHandler<in TEventArgs>(object sender, TEventArgs args);
- public sealed class AsyncEvent<TEventArgs>
- {
- private readonly object _lock;
- public AsyncEvent()
- {
- _lock = new object();
- }
- private event AsyncEventHandler<TEventArgs> Handler;
- public void Subscribe(AsyncEventHandler<TEventArgs> handler)
- {
- if (handler == null)
- {
- throw new ArgumentNullException(nameof(handler));
- }
- lock (_lock)
- {
- Handler += handler;
- }
- }
- public void Unsubscribe(AsyncEventHandler<TEventArgs> handler)
- {
- if (handler == null)
- {
- throw new ArgumentNullException(nameof(handler));
- }
- lock (_lock)
- {
- Handler -= handler;
- }
- }
- public void RemoveSubscribers()
- {
- lock (_lock)
- {
- Handler = null;
- }
- }
- public Task InvokeAsync(object sender, TEventArgs args)
- {
- if (Handler == null)
- {
- return Task.CompletedTask;
- }
- var tasks = Handler
- .GetInvocationList()
- .Cast<AsyncEventHandler<TEventArgs>>()
- .Select(s => s.Invoke(sender, args));
- return Task.WhenAll(tasks);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement