C#如何对多线程、多任务管理(demo)
下面一段内容有项目需求有项目分析,通过一个小demo给大家展示下C#如何对多线程、多任务管理的。
项目需求:假设多个任务需要执行,每个任务不是一时半会能完成(需要能看到中间执行状况);
多个任务根据条件不同可能需要不同的处理
项目分析:多线程并发执行多任务;
对任务进行管理,追踪中间执行状态;
运用策略模式抽象执行类;
publicenumTaskStatus { wait=0, working=1, stop=2, suspend=3, complete=4, fail=5, other=99 } publicclassTask { publicTaskDelegate<ParaStatus>taskStatus; publicTaskDelegate<ParaInfo>taskInfo; publicTaskDelegate<ParaProcess>taskProcess; privateTaskStatus_status=TaskStatus.wait; privateIExecuter_Executer{get;set;} privateGuid_taskId; privateThreadthread; privatestring_name; publicTask(Guidid,IExecuterExecuter) { _taskId=id; _Executer=Executer; _Executer.TaskId=id; _Executer.Task=this; } publicvoidWait() { ChangeStatus(TaskStatus.wait); } publicstringName { get { return_name; } set { _name=value; } } publicGuidTaskId { get { return_taskId; } } publicTaskStatusStatus { get { return_status; } set { _status=value; } } publicvoidStart() { if(thread==null) { thread=newThread(_Executer.Do); } elseif(thread.ThreadState==ThreadState.Stopped) { thread=newThread(_Executer.Do); } thread.Start(); ChangeStatus(TaskStatus.working); } publicvoidChangeStatus(TaskStatuss) { Status=s; ParaStatusps=newParaStatus(TaskId); ps.Status=Status; if(taskStatus!=null)taskStatus(ps); } publicvoidStop() { if(thread!=null) { if(thread.IsAlive) { try { thread.Abort(); } catch{} } } ChangeStatus(TaskStatus.stop); } publicvoidSuspend() { try { thread.Suspend(); } catch{} ChangeStatus(TaskStatus.suspend); } publicvoidResume() { if(thread.IsAlive) { thread.Resume(); } ChangeStatus(TaskStatus.working); } } publicinterfaceIExecuter { GuidTaskId{get;set;} TaskTask{get;set;} voidDo(); } publicclassExecuter:IExecuter { publicvoidExecute() { } #regionIExecute publicGuidTaskId{get;set;} publicTaskTask{get;set;} publicvoidDo() { for(inti=1;i<=100;i++) { if(Task.taskProcess!=null) { Thread.Sleep(1000); ParaProcesspp=newParaProcess(TaskId); pp.Rate=(double)i/100; Task.taskProcess(pp); } } if(Task.taskStatus!=null) { Task.ChangeStatus(TaskStatus.complete); } } #endregion } publicclassTaskManager { publicList<Task>Tasks=newList<Task>(); ///<summary> ///添加任务 ///</summary> publicTaskAddTask(Tasktask) { try { Tasks.Add(task); task.Wait(); } catch(Exceptione) { } returntask; } publicvoidStartTask(Tasktask) { task.Start(); } ///<summary> ///停止任务 ///</summary> ///<paramname="downloader"></param> publicvoidStopTask(Tasktask) { task.Stop(); } publicvoidSuspendTask(Tasktask) { task.Suspend(); } publicvoidResumeTask(Tasktask) { task.Resume(); } ///<summary> ///删除任务(自动终止未停止的任务) ///</summary> ///<paramname="downloader"></param> publicvoidDeleteTask(Tasktask,booldeleteFile) { //先停止任务 task.Stop(); while(task.Status==TaskStatus.working) { Thread.Sleep(50); } //从任务列表中删除任务 if(Tasks.Contains(task)) { Tasks.Remove(task); } } } ///</summary> ///<paramname="para">泛型参数</param> publicdelegatevoidTaskDelegate<T>(Tpara); ///<summary> /// ///</summary> publicclassParaStatus { publicParaStatus(Guidtask){TaskId=task;} publicGuidTaskId{get;set;} publicTaskStatusStatus{get;set;} } publicclassParaInfo { publicParaInfo(Guidtask){TaskId=task;} publicGuidTaskId{get;set;} publicstringInfo{get;set;} } publicclassParaProcess { publicParaProcess(Guidtask){TaskId=task;} publicGuidTaskId{get;set;} publicdoubleRate{get;set;} }
以上代码内容就是C#对多线程、多任务管理的方法,希望对大家有所帮助。