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

作者:clarlespeng 时间:2023-05-19 06:00:21 

下面一段内容有项目需求有项目分析,通过一个小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#对多线程、多任务管理的方法,希望对大家有所帮助。

标签:C#,多线程,多任务
0
投稿

猜你喜欢

  • SpringBoot实现本地存储文件上传及提供HTTP访问服务的方法

    2022-09-14 19:09:12
  • SpringSecurity构建基于JWT的登录认证实现

    2023-06-14 10:49:02
  • Java反射概念与使用实例代码

    2022-02-24 23:55:40
  • 全面分析Java文件上传

    2021-12-09 13:22:52
  • Android中让按钮拥有返回键功能的方法及重写返回键功能

    2021-08-08 10:33:56
  • C#中WinForm控件的拖动和缩放的实现代码

    2023-09-27 23:54:08
  • C#实现策略模式

    2022-02-09 17:19:01
  • 消息中间件详解以及比较选择

    2022-08-17 03:01:01
  • 使用spring框架中的组件发送邮件功能说明

    2022-12-29 03:53:55
  • C#获取文件创建时间的方法

    2022-04-25 22:56:55
  • java生成图片验证码示例程序

    2023-09-13 10:17:57
  • Java中checkbox实现跨页多选的方法

    2023-10-14 11:01:20
  • Fluent Mybatis让你摆脱Xml文件的技巧

    2023-10-02 18:31:00
  • java如何获取map中value的最大值

    2023-04-11 05:12:04
  • Android自定义荷载进度的两种方法

    2022-08-29 03:21:39
  • C#开发windows服务实现自动从FTP服务器下载文件

    2022-08-26 04:11:41
  • 浅谈SpringBoot @Autowired的两种注入方式

    2021-06-28 06:08:34
  • c# 命名空间和程序集

    2023-04-23 20:48:16
  • C#使用JArray和JObject封装JSON对象

    2022-10-15 16:56:16
  • 详解C#如何加密解密RAR文件

    2023-09-19 16:25:10
  • asp之家 软件编程 m.aspxhome.com