最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2015年07月29日 14:06:42   作者:clarlespeng  
這篇文章主要通過一個小demo介紹了C#如何對多線程、多任務(wù)管理,需要的朋友可以參考下

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

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

         多個任務(wù) 根據(jù)條件不同 可能需要不同的處理

項目分析: 多線程并發(fā)執(zhí)行多任務(wù);

         對任務(wù)進行管理,追蹤中間執(zhí)行狀態(tài);

         運用策略模式抽象執(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ù)(自動終止未停止的任務(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#對多線程、多任務(wù)管理的方法,希望對大家有所幫助。

相關(guān)文章

  • C#面向?qū)ο笤O(shè)計原則之開閉原則

    C#面向?qū)ο笤O(shè)計原則之開閉原則

    這篇文章介紹了C#面向?qū)ο笤O(shè)計原則之開閉原則,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • C#裝箱與拆箱操作的深入講解

    C#裝箱與拆箱操作的深入講解

    這篇文章主要給大家介紹了關(guān)于C#裝箱與拆箱操作的相關(guān)資料,文中通過圖文介紹的非常詳細,對大家的學(xué)習(xí)或者使用C#具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • c# 制作gif的四種方法

    c# 制作gif的四種方法

    這篇文章主要介紹了c# 制作gif的四種方法,幫助大家更好的理解和學(xué)習(xí)c#編程語言,感興趣的朋友可以了解下
    2020-12-12
  • C#項目彩票選號實現(xiàn)思路

    C#項目彩票選號實現(xiàn)思路

    今天做了一個彩票選號的小軟件,將學(xué)到的知識點總結(jié)一下,下面通過本文給大家分享C#項目彩票選號實現(xiàn)思路,感興趣的朋友跟隨小編一起看看吧
    2024-08-08
  • 輕松學(xué)習(xí)C#的方法

    輕松學(xué)習(xí)C#的方法

    輕松學(xué)習(xí)C#的方法,對C#的方法感興趣的朋友可以參考本篇文章,幫助大家更靈活的運用C#的方法
    2015-11-11
  • 用C#在本地創(chuàng)建一個Windows帳戶(DOS命令)

    用C#在本地創(chuàng)建一個Windows帳戶(DOS命令)

    用C#在本地創(chuàng)建一個Windows帳戶(DOS命令)...
    2007-03-03
  • C# 反射(Reflection)的用處分析

    C# 反射(Reflection)的用處分析

    反射(Reflection)是C#里很重要的一個特性,其它語言也有這個特性,比如JAVA。反射這個特性是很實用的,如果使用過struts, hibernate, spring等等這些框架的話,便會知道反射這個特性是多么的強大了。在我接觸過的那些框架中,沒有一個框架是不使用反射的。
    2015-03-03
  • C#連接mysql數(shù)據(jù)庫完整實例

    C#連接mysql數(shù)據(jù)庫完整實例

    這篇文章主要介紹了C#連接mysql數(shù)據(jù)庫的方法,以一個完整實例形式分析了C#操作mysql數(shù)據(jù)庫連接的基本技巧,非常具有實用價值,需要的朋友可以參考下
    2015-05-05
  • C#如何優(yōu)雅的結(jié)束線程

    C#如何優(yōu)雅的結(jié)束線程

    這篇文章主要介紹了C#如何優(yōu)雅的結(jié)束一個線程,本文通過示例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-05-05
  • c#簡單讀取文本的實例方法

    c#簡單讀取文本的實例方法

    c#簡單讀取文本的實例方法,需要的朋友可以參考一下
    2013-04-04

最新評論

乐亭县| 临夏市| 德化县| 逊克县| 大邑县| 梁平县| 江孜县| 榆社县| 长汀县| 甘德县| 婺源县| 南华县| 滨海县| 长寿区| 沁水县| 长兴县| 松阳县| 富宁县| 彭阳县| 堆龙德庆县| 洛宁县| 大庆市| 广汉市| 甘泉县| 道孚县| 黄山市| 志丹县| 游戏| 南陵县| 张掖市| 吐鲁番市| 织金县| 舞阳县| 崇礼县| 淮阳县| 东明县| 华池县| 游戏| 罗平县| 洞口县| 阳曲县|