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#对多线程、多任务管理的方法,希望对大家有所帮助。