国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C#如何對多線程、多任務管理(demo)

2020-01-24 01:35:00
字體:
來源:轉載
供稿:網友

下面一段內容有項目需求有項目分析,通過一個小demo給大家展示下C#如何對多線程、多任務管理的。

項目需求:假設多個任務需要執行,每個任務不是一時半會能完成(需要能看到中間執行狀況);

         多個任務 根據條件不同 可能需要不同的處理

項目分析: 多線程并發執行多任務;

         對任務進行管理,追蹤中間執行狀態;

         運用策略模式抽象執行類;

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>    /// 添加任務    /// </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>    /// 停止任務    /// </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>    /// 刪除任務(自動終止未停止的任務)    /// </summary>    /// <param name="downloader"></param>    public void DeleteTask(Task task, bool deleteFile)    {      //先停止任務      task.Stop();      while (task.Status == TaskStatus.working)      {        Thread.Sleep(50);      }      //從任務列表中刪除任務      if (Tasks.Contains(task))      {        Tasks.Remove(task);      }    }  } /// </summary>  /// <param name="para">泛型參數</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; }      }

以上代碼內容就是C#對多線程、多任務管理的方法,希望對大家有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 乐山市| 高尔夫| 昌乐县| 隆昌县| 驻马店市| 平塘县| 遂平县| 兴城市| 商南县| 句容市| 思茅市| 通道| 永吉县| 漠河县| 密云县| 平遥县| 安新县| 班玛县| 来宾市| 诸暨市| 陵川县| 巴中市| 广德县| 兰坪| 池州市| 老河口市| 兴隆县| 青阳县| 苍南县| 三门峡市| 甘泉县| 乌鲁木齐县| 昌平区| 聂拉木县| 宿州市| 陈巴尔虎旗| 社旗县| 沙雅县| 绍兴市| 鹤岗市| 遵义县|