需求:假設多個任務需要執行,每個任務不是一時半會能完成(需要能看到中間執行狀況);
多個任務 根據條件不同 可能需要不同的處理
分析: 多線程並發執行多任務;
對任務進行管理,追蹤中間執行狀態;
運用策略模式抽象執行類;
實現:
1 public enum TaskStatus 2 { 3 wait = 0, 4 working = 1, 5 stop = 2, 6 suspend = 3, 7 complete = 4, 8 fail = 5, 9 other = 99 10 } TaskStatus 1 public class Task 2 { 3 public TaskDelegate<ParaStatus> taskStatus; 4 public TaskDelegate<ParaInfo> taskInfo; 5 public TaskDelegate<ParaProcess> taskProcess; 6 7 private TaskStatus _status = TaskStatus.wait; 8 private IExecuter _Executer { get; set; } 9 private Guid _taskId; 10 private Thread thread; 11 private string _name; 12 13 public Task(Guid id, IExecuter Executer) 14 { 15 _taskId = id; 16 _Executer = Executer; 17 _Executer.TaskId = id; 18 _Executer.Task = this; 19 } 20 21 public void Wait() 22 { 23 ChangeStatus(TaskStatus.wait); 24 } 25 26 public string Name 27 { 28 get 29 { 30 return _name; 31 } 32 set 33 { 34 _name = value; 35 } 36 } 37 38 public Guid TaskId 39 { 40 get 41 { 42 return _taskId; 43 } 44 } 45 46 public TaskStatus Status 47 { 48 get 49 { 50 return _status; 51 } 52 set 53 { 54 _status = value; 55 } 56 } 57 58 public void Start() 59 { 60 if (thread == null) 61 { 62 thread = new Thread(_Executer.Do); 63 } 64 else if (thread.ThreadState == ThreadState.Stopped) 65 { 66 thread = new Thread(_Executer.Do); 67 } 68 thread.Start(); 69 ChangeStatus(TaskStatus.working); 70 } 71 public void ChangeStatus(TaskStatus s) 72 { 73 Status = s; 74 ParaStatus ps = new ParaStatus(TaskId); 75 ps.Status = Status; 76 if (taskStatus != null) taskStatus(ps); 77 } 78 public void Stop() 79 { 80 if (thread != null) 81 { 82 if (thread.IsAlive) 83 { 84 try 85 { 86 thread.Abort(); 87 } 88 catch { } 89 } 90 } 91 ChangeStatus(TaskStatus.stop); 92 } 93 public void Suspend() 94 { 95 try 96 { 97 thread.Suspend(); 98 } 99 catch { } 100 ChangeStatus(TaskStatus.suspend); 101 } 102 public void Resume() 103 { 104 if (thread.IsAlive) 105 { 106 thread.Resume(); 107 } 108 ChangeStatus(TaskStatus.working); 109 } 110 } Task 1 public interface IExecuter 2 { 3 Guid TaskId { get; set; } 4 5 Task Task { get; set; } 6 void Do(); 7 } IExecuter 1 public class Executer : IExecuter 2 { 3 public void Execute() 4 { 5 6 } 7 #region IExecute 8 public Guid TaskId { get; set; } 9 10 public Task Task { get; set; } 11 12 public void Do() 13 { 14 for (int i = 1; i <= 100; i++) 15 { 16 if (Task.taskProcess != null) 17 { 18 Thread.Sleep(1000); 19 ParaProcess pp = new ParaProcess(TaskId); 20 pp.Rate = (double)i / 100; 21 Task.taskProcess(pp); 22 } 23 } 24 if (Task.taskStatus != null) 25 { 26 Task.ChangeStatus(TaskStatus.complete); 27 } 28 } 29 #endregion 30 } Executer 1 public class TaskManager 2 { 3 public List<Task> Tasks = new List<Task>(); 4 /// <summary> 5 /// 添加任務 6 /// </summary> 7 public Task AddTask(Task task) 8 { 9 try 10 { 11 Tasks.Add(task); 12 13 task.Wait(); 14 } 15 catch (Exception e) 16 { 17 18 } 19 return task; 20 } 21 public void StartTask(Task task) 22 { 23 task.Start(); 24 } 25 /// <summary> 26 /// 停止任務 27 /// </summary> 28 /// <param name="downloader"></param> 29 public void StopTask(Task task) 30 { 31 task.Stop(); 32 } 33 34 public void SuspendTask(Task task) 35 { 36 task.Suspend(); 37 } 38 39 public void ResumeTask(Task task) 40 { 41 task.Resume(); 42 } 43 44 /// <summary> 45 /// 刪除任務(自動終止未停止的任務) 46 /// </summary> 47 /// <param name="downloader"></param> 48 public void DeleteTask(Task task, bool deleteFile) 49 { 50 //先停止任務 51 task.Stop(); 52 53 while (task.Status == TaskStatus.working) 54 { 55 Thread.Sleep(50); 56 } 57 58 //從任務列表中刪除任務 59 if (Tasks.Contains(task)) 60 { 61 Tasks.Remove(task); 62 } 63 } 64 65 } TaskManager 1 /// </summary> 2 /// <param name="para">泛型參數</param> 3 public delegate void TaskDelegate<T>(T para); 4 5 /// <summary> 6 /// 7 /// </summary> 8 public class ParaStatus 9 { 10 public ParaStatus(Guid task) { TaskId = task; } 11 public Guid TaskId { get; set; } 12 public TaskStatus Status { get; set; } 13 } 14 15 public class ParaInfo 16 { 17 public ParaInfo(Guid task) { TaskId = task; } 18 public Guid TaskId { get; set; } 19 public string Info { get; set; } 20 } 21 22 public class ParaProcess 23 { 24 public ParaProcess(Guid task) { TaskId = task; } 25 public Guid TaskId { get; set; } 26 public double Rate { get; set; } 27 } TaskDelegate
demo 下載:demo