首页 > 编程 > C# > 正文

C#如何对多线程、多任务管理(demo)

2019-10-29 21:39:45
字体:
来源:转载
供稿:网友

这篇文章主要通过一个小demo介绍了C#如何对多线程、多任务管理,需要的朋友可以参考下

下面一段内容有项目需求有项目分析,通过一个小demo给大家展示下C#如何对多线程、多任务管理的。

项目需求:假设多个任务需要执行,每个任务不是一时半会能完成(需要能看到中间执行状况);

多个任务 根据条件不同 可能需要不同的处理

项目分析: 多线程并发执行多任务;

对任务进行管理,追踪中间执行状态;

运用策略模式抽象执行类;

 

 
  1. public enum TaskStatus 
  2. wait = 0, 
  3. working = 1, 
  4. stop = 2, 
  5. suspend = 3, 
  6. complete = 4, 
  7. fail = 5, 
  8. other = 99 
  9.  
  10. public class Task 
  11. public TaskDelegate<ParaStatus> taskStatus; 
  12. public TaskDelegate<ParaInfo> taskInfo; 
  13. public TaskDelegate<ParaProcess> taskProcess; 
  14.  
  15. private TaskStatus _status = TaskStatus.wait; 
  16. private IExecuter _Executer { get; set; } 
  17. private Guid _taskId; 
  18. private Thread thread; 
  19. private string _name; 
  20.  
  21. public Task(Guid id, IExecuter Executer) 
  22. _taskId = id; 
  23. _Executer = Executer; 
  24. _Executer.TaskId = id; 
  25. _Executer.Task = this
  26.  
  27. public void Wait() 
  28. ChangeStatus(TaskStatus.wait); 
  29.  
  30. public string Name 
  31. get 
  32. return _name; 
  33. set 
  34. _name = value; 
  35.  
  36. public Guid TaskId 
  37. get 
  38. return _taskId; 
  39.  
  40. public TaskStatus Status 
  41. get 
  42. return _status; 
  43. set 
  44. _status = value; 
  45. }  
  46.  
  47. public void Start() 
  48. if (thread == null
  49. thread = new Thread(_Executer.Do); 
  50. else if (thread.ThreadState == ThreadState.Stopped) 
  51. thread = new Thread(_Executer.Do); 
  52. thread.Start(); 
  53. ChangeStatus(TaskStatus.working); 
  54. public void ChangeStatus(TaskStatus s) 
  55. Status = s; 
  56. ParaStatus ps = new ParaStatus(TaskId); 
  57. ps.Status = Status; 
  58. if (taskStatus != null) taskStatus(ps); 
  59. public void Stop() 
  60. if (thread != null
  61. if (thread.IsAlive) 
  62. try 
  63. thread.Abort(); 
  64. catch { } 
  65. ChangeStatus(TaskStatus.stop); 
  66. public void Suspend() 
  67. try 
  68. thread.Suspend(); 
  69. catch { } 
  70. ChangeStatus(TaskStatus.suspend); 
  71. public void Resume() 
  72. if (thread.IsAlive) 
  73. thread.Resume(); 
  74. ChangeStatus(TaskStatus.working); 
  75.  
  76. public interface IExecuter 
  77. Guid TaskId { get; set; } 
  78.  
  79. Task Task { get; set; } 
  80. void Do(); 
  81.  
  82.  
  83.  
  84. public class Executer : IExecuter 
  85. public void Execute() 
  86.  
  87. #region IExecute 
  88. public Guid TaskId { get; set; } 
  89.  
  90. public Task Task { get; set; } 
  91.  
  92. public void Do() 
  93. for (int i = 1; i <= 100; i++) 
  94. if (Task.taskProcess != null
  95. Thread.Sleep(1000); 
  96. ParaProcess pp = new ParaProcess(TaskId); 
  97. pp.Rate = (double)i / 100; 
  98. Task.taskProcess(pp);  
  99. if (Task.taskStatus != null
  100. Task.ChangeStatus(TaskStatus.complete); 
  101. #endregion 
  102.  
  103. public class TaskManager 
  104. public List<Task> Tasks = new List<Task>(); 
  105. /// <summary> 
  106. /// 添加任务 
  107. /// </summary> 
  108. public Task AddTask(Task task) 
  109. try 
  110. Tasks.Add(task); 
  111.  
  112. task.Wait(); 
  113. catch (Exception e) 
  114.  
  115. return task; 
  116. public void StartTask(Task task) 
  117. task.Start(); 
  118. /// <summary> 
  119. /// 停止任务 
  120. /// </summary> 
  121. /// <param name="downloader"></param> 
  122. public void StopTask(Task task) 
  123. task.Stop(); 
  124.  
  125. public void SuspendTask(Task task) 
  126. task.Suspend(); 
  127.  
  128. public void ResumeTask(Task task) 
  129. task.Resume(); 
  130.  
  131. /// <summary> 
  132. /// 删除任务(自动终止未停止的任务) 
  133. /// </summary> 
  134. /// <param name="downloader"></param> 
  135. public void DeleteTask(Task task, bool deleteFile) 
  136. //先停止任务 
  137. task.Stop(); 
  138.  
  139. while (task.Status == TaskStatus.working) 
  140. Thread.Sleep(50); 
  141.  
  142. //从任务列表中删除任务 
  143. if (Tasks.Contains(task)) 
  144. Tasks.Remove(task); 
  145.  
  146.  
  147.  
  148. /// </summary> 
  149. /// <param name="para">泛型参数</param> 
  150. public delegate void TaskDelegate<T>(T para); 
  151.  
  152. /// <summary> 
  153. ///  
  154. /// </summary> 
  155. public class ParaStatus 
  156. public ParaStatus(Guid task) { TaskId = task; } 
  157. public Guid TaskId { get; set; } 
  158. public TaskStatus Status { get; set; } 
  159. }  
  160.  
  161. public class ParaInfo 
  162. public ParaInfo(Guid task) { TaskId = task; } 
  163. public Guid TaskId { get; set; } 
  164. public string Info { get; set; } 
  165.  
  166. public class ParaProcess 
  167. public ParaProcess(Guid task) { TaskId = task; } 
  168. public Guid TaskId { get; set; } 
  169. public double Rate { get; set; }  

以上代码内容就是C#对多线程、多任务管理的方法,希望对大家有所帮助。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表