ETCancellationToken.cs 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics.CodeAnalysis;
  4. namespace ET
  5. {
  6. public class ETCancellationToken
  7. {
  8. private HashSet<Action> actions = new HashSet<Action>();
  9. public void Add(Action callback)
  10. {
  11. // 如果action是null,绝对不能添加,要抛异常,说明有协程泄漏
  12. this.actions.Add(callback);
  13. }
  14. public void Remove(Action callback)
  15. {
  16. this.actions?.Remove(callback);
  17. }
  18. public bool IsDispose()
  19. {
  20. return this.actions == null;
  21. }
  22. public void Cancel()
  23. {
  24. if (this.actions == null)
  25. {
  26. return;
  27. }
  28. this.Invoke();
  29. }
  30. private void Invoke()
  31. {
  32. HashSet<Action> runActions = this.actions;
  33. this.actions = null;
  34. try
  35. {
  36. foreach (Action action in runActions)
  37. {
  38. action.Invoke();
  39. }
  40. }
  41. catch (Exception e)
  42. {
  43. ETTask.ExceptionHandler.Invoke(e);
  44. }
  45. }
  46. }
  47. }