TaskTokener.cs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. using System.Collections.Concurrent;
  2. namespace SKMC.Api.Common.Tasks
  3. {
  4. /// <summary>
  5. /// TaskToken(任务执行控制令牌)容器
  6. /// 用于管理多个TaskToken相关的线程执行暂停、恢复、停止
  7. /// </summary>
  8. public class TaskTokener
  9. {
  10. private static readonly ConcurrentDictionary<int, TaskToken> taskTokens = new ConcurrentDictionary<int, TaskToken>();
  11. /// <summary>
  12. /// 创建一个TaskToken
  13. /// </summary>
  14. /// <param name="id">TaskToken的Id</param>
  15. public static TaskToken Add(int id)
  16. {
  17. if (taskTokens.ContainsKey(id))
  18. {
  19. taskTokens.TryRemove(id, out var taskTokenGet);
  20. taskTokenGet?.Cancel();
  21. };
  22. TaskToken taskTokenNew = new TaskToken { Id = id };
  23. bool result = taskTokens.TryAdd(id, taskTokenNew);
  24. if (result) return taskTokenNew;
  25. return null;
  26. }
  27. /// <summary>
  28. /// 重新创建所有的TaskToken
  29. /// </summary>
  30. public static void AddAll()
  31. {
  32. foreach (int stationId in taskTokens.Keys)
  33. {
  34. TaskToken taskToken = GetTaskToken(stationId);
  35. if (taskToken == null) continue;
  36. Add(stationId);
  37. }
  38. }
  39. /// <summary>
  40. /// 根据Id获取TaskToken
  41. /// </summary>
  42. /// <param name="id">TaskToken的Id</param>
  43. /// <returns></returns>
  44. public static TaskToken GetTaskToken(int id)
  45. {
  46. if (!taskTokens.ContainsKey(id))
  47. {
  48. Add(id);
  49. }
  50. return taskTokens[id];
  51. }
  52. /// <summary>
  53. /// 设置TaskToken中断点(在Stop之前有效)
  54. /// </summary>
  55. /// <param name="id"></param>
  56. public static void SetWaitPoint(int id) => SetWaitPoint(GetTaskToken(id));
  57. /// <summary>
  58. /// 设置TaskToken中断点(在Stop之前有效)
  59. /// </summary>
  60. /// <param name="taskToken"></param>
  61. public static void SetWaitPoint(TaskToken taskToken)
  62. {
  63. if (taskToken == null) return;
  64. taskToken.SetWaitPoint();
  65. }
  66. /// <summary>
  67. /// TaskToken是否已取消/停止
  68. /// </summary>
  69. /// <param name="id"></param>
  70. /// <returns></returns>
  71. public static bool IsCancelled(int id) => IsCancelled(GetTaskToken(id));
  72. /// <summary>
  73. /// TaskToken是否已取消/停止
  74. /// </summary>
  75. /// <param name="taskToken"></param>
  76. /// <returns></returns>
  77. public static bool IsCancelled(TaskToken taskToken)
  78. {
  79. if (taskToken == null) return true;
  80. return taskToken.IsCancelled();
  81. }
  82. /// <summary>
  83. /// 暂停TaskToken
  84. /// </summary>
  85. /// <param name="id"></param>
  86. public static void Pause(int id) => Pause(GetTaskToken(id));
  87. /// <summary>
  88. /// 暂停TaskToken
  89. /// </summary>
  90. /// <param name="taskToken"></param>
  91. public static void Pause(TaskToken taskToken)
  92. {
  93. if (taskToken == null) return;
  94. taskToken.Pause();
  95. }
  96. /// <summary>
  97. /// 暂停所有的TaskToken
  98. /// </summary>
  99. public static void PauseAll()
  100. {
  101. foreach (int stationId in taskTokens.Keys)
  102. {
  103. Pause(stationId);
  104. }
  105. }
  106. /// <summary>
  107. /// 恢复TaskToken
  108. /// </summary>
  109. /// <param name="id"></param>
  110. public static void Resume(int id) => Resume(GetTaskToken(id));
  111. /// <summary>
  112. /// 恢复TaskToken
  113. /// </summary>
  114. /// <param name="taskToken"></param>
  115. public static void Resume(TaskToken taskToken)
  116. {
  117. if (taskToken == null) return;
  118. taskToken.Resume();
  119. }
  120. /// <summary>
  121. /// 恢复所有的TaskToken
  122. /// </summary>
  123. public static void ResumeAll()
  124. {
  125. foreach (int station in taskTokens.Keys)
  126. {
  127. Resume(station);
  128. }
  129. }
  130. /// <summary>
  131. /// 停止TaskToken
  132. /// </summary>
  133. /// <param name="id"></param>
  134. public static void Stop(int id) => Stop(GetTaskToken(id));
  135. /// <summary>
  136. /// 停止TaskToken
  137. /// </summary>
  138. /// <param name="taskToken"></param>
  139. public static void Stop(TaskToken taskToken)
  140. {
  141. if (taskToken == null) return;
  142. taskToken.Stop();
  143. //taskTokens.TryRemove(taskToken.Id, out _);
  144. }
  145. /// <summary>
  146. /// 停止所有的TaskToken
  147. /// </summary>
  148. public static void StopAll()
  149. {
  150. foreach (int stationId in taskTokens.Keys)
  151. {
  152. Stop(stationId);
  153. }
  154. }
  155. }
  156. }