多線程、多任務管理 簡單demo,多線程demo
需求:假設多個任務需要執行,每個任務不是一時半會能完成(需要能看到中間執行狀況);
多個任務 根據條件不同 可能需要不同的處理
分析: 多線程並發執行多任務;
對任務進行管理,追蹤中間執行狀態;
運用策略模式抽象執行類;
實現:

![]()
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