Advertisement
Guest User

Untitled

a guest
Jul 23rd, 2019
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.59 KB | None | 0 0
  1. using System;
  2. using System.Linq;
  3. using System.Threading.Tasks;
  4.  
  5. namespace AsynchronousEvent
  6. {
  7. public delegate Task AsyncEventHandler<in TEventArgs>(object sender, TEventArgs args);
  8.  
  9. public sealed class AsyncEvent<TEventArgs>
  10. {
  11. private readonly object _lock;
  12.  
  13. public AsyncEvent()
  14. {
  15. _lock = new object();
  16. }
  17.  
  18. private event AsyncEventHandler<TEventArgs> Handler;
  19.  
  20. public void Subscribe(AsyncEventHandler<TEventArgs> handler)
  21. {
  22. if (handler == null)
  23. {
  24. throw new ArgumentNullException(nameof(handler));
  25. }
  26.  
  27. lock (_lock)
  28. {
  29. Handler += handler;
  30. }
  31. }
  32.  
  33. public void Unsubscribe(AsyncEventHandler<TEventArgs> handler)
  34. {
  35. if (handler == null)
  36. {
  37. throw new ArgumentNullException(nameof(handler));
  38. }
  39.  
  40. lock (_lock)
  41. {
  42. Handler -= handler;
  43. }
  44. }
  45.  
  46. public void RemoveSubscribers()
  47. {
  48. lock (_lock)
  49. {
  50. Handler = null;
  51. }
  52. }
  53.  
  54. public Task InvokeAsync(object sender, TEventArgs args)
  55. {
  56. if (Handler == null)
  57. {
  58. return Task.CompletedTask;
  59. }
  60.  
  61. var tasks = Handler
  62. .GetInvocationList()
  63. .Cast<AsyncEventHandler<TEventArgs>>()
  64. .Select(s => s.Invoke(sender, args));
  65.  
  66. return Task.WhenAll(tasks);
  67. }
  68. }
  69. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement