TaskExecManager.cs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. using AmrControl.Common;
  2. using AmrControl.JGR;
  3. using System.Collections.Concurrent;
  4. namespace AmrControl.services
  5. {
  6. public class TaskExecManager : ITaskExecManager
  7. {
  8. /// <summary>
  9. /// 任务列表
  10. /// </summary>
  11. private ConcurrentQueue<Dictionary<string, Proxy>> tasks = new();
  12. /// <summary>
  13. /// 进行中的任务
  14. /// </summary>
  15. private volatile string? curTaskId;
  16. /// <summary>
  17. /// 运行状态
  18. /// </summary>
  19. private volatile bool _running;
  20. /// <summary>
  21. /// 完成任务列表
  22. /// </summary>
  23. private volatile List<string> completedTasks = new();
  24. /// <summary>
  25. /// 锁对象
  26. /// </summary>
  27. Mutex mutex = new Mutex();
  28. private static volatile TaskExecManager Instance = null;
  29. public TaskExecManager()
  30. {
  31. Instance = this;
  32. }
  33. public static ITaskExecManager getInstance()
  34. {
  35. return Instance;
  36. }
  37. /// <summary>
  38. /// 添加任务
  39. /// </summary>
  40. /// <param name="proxy"></param>
  41. /// <param name="taskId"></param>
  42. public void addTask(Proxy proxy, string taskId)
  43. {
  44. tasks.Enqueue(new Dictionary<string, Proxy>() { { taskId, proxy } });
  45. }
  46. /// <summary>
  47. /// 检查任务是否完成
  48. /// </summary>
  49. /// <param name="taskId"></param>
  50. /// <returns></returns>
  51. public bool checkTaskIsCompleted(string taskId)
  52. {
  53. try
  54. {
  55. mutex.WaitOne();
  56. return completedTasks.Remove(taskId);
  57. }
  58. finally
  59. {
  60. mutex.ReleaseMutex();
  61. }
  62. }
  63. /// <summary>
  64. /// 生成任务id
  65. /// </summary>
  66. /// <returns></returns>
  67. public string genTaskId()
  68. {
  69. return Guid.NewGuid().ToString();
  70. }
  71. /// <summary>
  72. /// 通知任务完成
  73. /// </summary>
  74. /// <param name="taskId"></param>
  75. /// <returns></returns>
  76. public void notifyTaskCompleted(string taskId)
  77. {
  78. try
  79. {
  80. mutex.WaitOne();
  81. completedTasks.Add(taskId);
  82. }
  83. finally
  84. {
  85. mutex.ReleaseMutex();
  86. }
  87. }
  88. public void start()
  89. {
  90. if (!_running)
  91. {
  92. _running = true;
  93. startTask();
  94. }
  95. }
  96. public void stop()
  97. {
  98. //修改运行状态标识
  99. _running = false;
  100. }
  101. async void startTask()
  102. {
  103. while (_running)
  104. {
  105. Dictionary<string, Proxy> taskDic = null;
  106. _ = tasks.TryDequeue(out taskDic);
  107. if (taskDic != null)
  108. {
  109. try
  110. {
  111. curTaskId = taskDic.Keys.First();
  112. //将当前任务id放入线程上下文
  113. ThreadLocalManager.Set(new ThreadLocalContext() { taskId = curTaskId });
  114. taskDic[curTaskId].Invoke();
  115. ////等待任务完成
  116. //do
  117. //{
  118. // await Task.Delay(TimeSpan.FromMilliseconds(300));
  119. //} while (!checkTaskIsCompleted(curTaskId));
  120. } catch (Exception ex)
  121. {
  122. Console.WriteLine($"执行任务产生异常,异常原因:${ex.Message}");
  123. }
  124. //finally
  125. //{
  126. // ThreadLocalManager.Remove();
  127. //}
  128. }
  129. else
  130. {
  131. await Task.Delay(TimeSpan.FromMilliseconds(300));
  132. }
  133. }
  134. }
  135. }
  136. }