TaskTokener.cs 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. using System.Collections.Concurrent;
  2. namespace SKMC.Api.Common.Tasks
  3. {
  4. public class TaskTokener
  5. {
  6. private static readonly ConcurrentDictionary<int, TaskToken> taskTokens = new ConcurrentDictionary<int, TaskToken>();
  7. public static void Add(int id)
  8. {
  9. if (taskTokens.ContainsKey(id))
  10. {
  11. taskTokens.TryRemove(id, out var taskToken);
  12. taskToken?.TokenSource.Cancel();
  13. };
  14. taskTokens.TryAdd(id, new TaskToken());
  15. }
  16. public static TaskToken GetTaskToken(int id)
  17. {
  18. if (!taskTokens.ContainsKey(id))
  19. {
  20. Add(id);
  21. }
  22. return taskTokens[id];
  23. }
  24. public static void SetWaitPoint(int id)
  25. {
  26. TaskToken taskToken = GetTaskToken(id);
  27. if (taskToken == null) return;
  28. taskToken.SetWaitPoint();
  29. }
  30. public static bool IsCancelled(int id)
  31. {
  32. TaskToken taskToken = GetTaskToken(id);
  33. if (taskToken == null) return true;
  34. bool result = taskToken.TokenSource.IsCancellationRequested;
  35. return result;
  36. }
  37. public static void Pause(int id)
  38. {
  39. TaskToken taskToken = GetTaskToken(id);
  40. if (taskToken == null) return;
  41. taskToken.ResetEvent.Reset();
  42. }
  43. public static void PauseAll()
  44. {
  45. foreach (int stationId in taskTokens.Keys)
  46. {
  47. Pause(stationId);
  48. }
  49. }
  50. public static void Resume(int id)
  51. {
  52. TaskToken taskToken = GetTaskToken(id);
  53. if (taskToken == null) return;
  54. taskToken.ResetEvent.Set();
  55. }
  56. public static void ResumeAll()
  57. {
  58. foreach (int station in taskTokens.Keys)
  59. {
  60. Resume(station);
  61. }
  62. }
  63. public static void Stop(int id)
  64. {
  65. TaskToken taskToken = GetTaskToken(id);
  66. if (taskToken == null) return;
  67. taskToken.TokenSource.Cancel();
  68. taskToken.ResetEvent.Set();
  69. }
  70. public static void StopAll()
  71. {
  72. foreach (int stationId in taskTokens.Keys)
  73. {
  74. Stop(stationId);
  75. }
  76. }
  77. public static void RestoreAll()
  78. {
  79. foreach (int stationId in taskTokens.Keys)
  80. {
  81. TaskToken taskToken = GetTaskToken(stationId);
  82. if (taskToken == null) continue;
  83. Add(stationId);
  84. }
  85. }
  86. }
  87. }