栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C# > C#教程

C#如何对多线程、多任务管理(demo)

C#教程 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C#如何对多线程、多任务管理(demo)

下面一段内容有项目需求有项目分析,通过一个小demo给大家展示下C#如何对多线程、多任务管理的。

项目需求:假设多个任务需要执行,每个任务不是一时半会能完成(需要能看到中间执行状况);

         多个任务 根据条件不同 可能需要不同的处理

项目分析: 多线程并发执行多任务;

         对任务进行管理,追踪中间执行状态;

         运用策略模式抽象执行类;

public enum TaskStatus
  {
    wait = 0,
    working = 1,
    stop = 2,
    suspend = 3,
    complete = 4,
    fail = 5,
    other = 99
  }

 public class Task
   {
     public TaskDelegate taskStatus;
     public TaskDelegate taskInfo;
     public TaskDelegate 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 Tasks = new List();
    /// 
    /// 添加任务
    /// 
    public Task AddTask(Task task)
    {
      try
      {
 Tasks.Add(task);

 task.Wait();
      }
      catch (Exception e)
      {

      }
      return task;
    }
    public void StartTask(Task task)
    {
      task.Start();
    }
    /// 
    /// 停止任务
    /// 
    /// 
    public void StopTask(Task task)
    {
      task.Stop();
    }

    public void SuspendTask(Task task)
    {
      task.Suspend();
    }

    public void Resumetask(Task task)
    {
      task.Resume();
    }

    /// 
    /// 删除任务(自动终止未停止的任务)
    /// 
    /// 
    public void DeleteTask(Task task, bool deleteFile)
    {
      //先停止任务
      task.Stop();

      while (task.Status == TaskStatus.working)
      {
 Thread.Sleep(50);
      }

      //从任务列表中删除任务
      if (Tasks.Contains(task))
      {
 Tasks.Remove(task);
      }
    }

  }


 /// 
  /// 泛型参数
  public delegate void TaskDelegate(T para);

  /// 
  /// 
  /// 
  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#对多线程、多任务管理的方法,希望对大家有所帮助。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/124891.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号