C#如何對(duì)多線程、多任務(wù)管理(demo)
下面一段內(nèi)容有項(xiàng)目需求有項(xiàng)目分析,通過(guò)一個(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)文章
Unity的IFilterBuildAssemblies實(shí)用案例深入解析
這篇文章主要為大家介紹了Unity的IFilterBuildAssemblies實(shí)用案例深入解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
Unity實(shí)現(xiàn)人物平滑轉(zhuǎn)身
這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)人物平滑轉(zhuǎn)身,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-01-01
C#實(shí)現(xiàn)讀取寫(xiě)入Json文件
這篇文章主要介紹了C#實(shí)現(xiàn)讀取寫(xiě)入Json文件方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01
C#操作mysql數(shù)據(jù)庫(kù)的代碼實(shí)例
這篇文章為大家提供了一個(gè)C#操作mysql數(shù)據(jù)庫(kù)的實(shí)例,大家可以參考使用2013-11-11
C#連接mysql數(shù)據(jù)庫(kù)完整實(shí)例

