欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

下面一段內(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#七大經(jīng)典排序算法系列(下)

    C#七大經(jīng)典排序算法系列(下)

    這篇文章主要為大家詳細(xì)介紹了C#七大經(jīng)典排序算法系列下篇,直接插入排序,希爾排序和歸并排序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • C#連接mysql數(shù)據(jù)庫完整實(shí)例

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

    這篇文章主要介紹了C#連接mysql數(shù)據(jù)庫的方法,以一個(gè)完整實(shí)例形式分析了C#操作mysql數(shù)據(jù)庫連接的基本技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-05-05
  • c#中判斷字符串是不是數(shù)字或字母的方法

    c#中判斷字符串是不是數(shù)字或字母的方法

    這篇文章介紹了C#判斷字符串是否數(shù)字或字母的實(shí)例,有需要的朋友可以參考一下
    2013-06-06
  • 最新評(píng)論