C#如何對(duì)多線程、多任務(wù)管理(demo)
下面一段內(nèi)容有項(xiàng)目需求有項(xiàng)目分析,通過一個(gè)小demo給大家展示下C#如何對(duì)多線程、多任務(wù)管理的。
項(xiàng)目需求:假設(shè)多個(gè)任務(wù)需要執(zhí)行,每個(gè)任務(wù)不是一時(shí)半會(huì)能完成(需要能看到中間執(zhí)行狀況);
多個(gè)任務(wù) 根據(jù)條件不同 可能需要不同的處理
項(xiàng)目分析: 多線程并發(fā)執(zhí)行多任務(wù);
對(duì)任務(wù)進(jìn)行管理,追蹤中間執(zhí)行狀態(tài);
運(yùn)用策略模式抽象執(zhí)行類;
public enum TaskStatus
{
wait = 0,
working = 1,
stop = 2,
suspend = 3,
complete = 4,
fail = 5,
other = 99
}
public class Task
{
public TaskDelegate<ParaStatus> taskStatus;
public TaskDelegate<ParaInfo> taskInfo;
public TaskDelegate<ParaProcess> taskProcess;
private TaskStatus _status = TaskStatus.wait;
private IExecuter _Executer { get; set; }
private Guid _taskId;
private Thread thread;
private string _name;
public Task(Guid id, IExecuter Executer)
{
_taskId = id;
_Executer = Executer;
_Executer.TaskId = id;
_Executer.Task = this;
}
public void Wait()
{
ChangeStatus(TaskStatus.wait);
}
public string Name
{
get
{
return _name;
}
set
{
_name = value;
}
}
public Guid TaskId
{
get
{
return _taskId;
}
}
public TaskStatus Status
{
get
{
return _status;
}
set
{
_status = value;
}
}
public void Start()
{
if (thread == null)
{
thread = new Thread(_Executer.Do);
}
else if (thread.ThreadState == ThreadState.Stopped)
{
thread = new Thread(_Executer.Do);
}
thread.Start();
ChangeStatus(TaskStatus.working);
}
public void ChangeStatus(TaskStatus s)
{
Status = s;
ParaStatus ps = new ParaStatus(TaskId);
ps.Status = Status;
if (taskStatus != null) taskStatus(ps);
}
public void Stop()
{
if (thread != null)
{
if (thread.IsAlive)
{
try
{
thread.Abort();
}
catch { }
}
}
ChangeStatus(TaskStatus.stop);
}
public void Suspend()
{
try
{
thread.Suspend();
}
catch { }
ChangeStatus(TaskStatus.suspend);
}
public void Resume()
{
if (thread.IsAlive)
{
thread.Resume();
}
ChangeStatus(TaskStatus.working);
}
}
public interface IExecuter
{
Guid TaskId { get; set; }
Task Task { get; set; }
void Do();
}
public class Executer : IExecuter
{
public void Execute()
{
}
#region IExecute
public Guid TaskId { get; set; }
public Task Task { get; set; }
public void Do()
{
for (int i = 1; i <= 100; i++)
{
if (Task.taskProcess != null)
{
Thread.Sleep(1000);
ParaProcess pp = new ParaProcess(TaskId);
pp.Rate = (double)i / 100;
Task.taskProcess(pp);
}
}
if (Task.taskStatus != null)
{
Task.ChangeStatus(TaskStatus.complete);
}
}
#endregion
}
public class TaskManager
{
public List<Task> Tasks = new List<Task>();
/// <summary>
/// 添加任務(wù)
/// </summary>
public Task AddTask(Task task)
{
try
{
Tasks.Add(task);
task.Wait();
}
catch (Exception e)
{
}
return task;
}
public void StartTask(Task task)
{
task.Start();
}
/// <summary>
/// 停止任務(wù)
/// </summary>
/// <param name="downloader"></param>
public void StopTask(Task task)
{
task.Stop();
}
public void SuspendTask(Task task)
{
task.Suspend();
}
public void ResumeTask(Task task)
{
task.Resume();
}
/// <summary>
/// 刪除任務(wù)(自動(dòng)終止未停止的任務(wù))
/// </summary>
/// <param name="downloader"></param>
public void DeleteTask(Task task, bool deleteFile)
{
//先停止任務(wù)
task.Stop();
while (task.Status == TaskStatus.working)
{
Thread.Sleep(50);
}
//從任務(wù)列表中刪除任務(wù)
if (Tasks.Contains(task))
{
Tasks.Remove(task);
}
}
}
/// </summary>
/// <param name="para">泛型參數(shù)</param>
public delegate void TaskDelegate<T>(T para);
/// <summary>
///
/// </summary>
public class ParaStatus
{
public ParaStatus(Guid task) { TaskId = task; }
public Guid TaskId { get; set; }
public TaskStatus Status { get; set; }
}
public class ParaInfo
{
public ParaInfo(Guid task) { TaskId = task; }
public Guid TaskId { get; set; }
public string Info { get; set; }
}
public class ParaProcess
{
public ParaProcess(Guid task) { TaskId = task; }
public Guid TaskId { get; set; }
public double Rate { get; set; }
}
以上代碼內(nèi)容就是C#對(duì)多線程、多任務(wù)管理的方法,希望對(duì)大家有所幫助。
相關(guān)文章
C#項(xiàng)目彩票選號(hào)實(shí)現(xiàn)思路
今天做了一個(gè)彩票選號(hào)的小軟件,將學(xué)到的知識(shí)點(diǎn)總結(jié)一下,下面通過本文給大家分享C#項(xiàng)目彩票選號(hào)實(shí)現(xiàn)思路,感興趣的朋友跟隨小編一起看看吧2024-08-08
用C#在本地創(chuàng)建一個(gè)Windows帳戶(DOS命令)
用C#在本地創(chuàng)建一個(gè)Windows帳戶(DOS命令)...2007-03-03
C#連接mysql數(shù)據(jù)庫(kù)完整實(shí)例
這篇文章主要介紹了C#連接mysql數(shù)據(jù)庫(kù)的方法,以一個(gè)完整實(shí)例形式分析了C#操作mysql數(shù)據(jù)庫(kù)連接的基本技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-05-05

