C#如何对多线程、多任务管理(demo)
作者:clarlespeng 发布时间:2023-05-19 06:00:21
标签:C#,多线程,多任务
下面一段内容有项目需求有项目分析,通过一个小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#运算符重载用法。分享给大家供大家参考。具体分析如下:public class Plane { public
- 本文实例讲述了C#队列Queue多线程用法。分享给大家供大家参考。具体分析如下:这里展示一个例子,供学习使用:private void bu
- nacos使用占位符${}进行参数配置的方法有的时候,我们的nacos会出现一个配置文件里,有多个配置项对应的值都是一样的,这个时候naco
- 在上个月的对C#开发微信门户及应用做了介绍,写过了几篇的随笔进行分享,由于时间关系,间隔了一段时间没有继续写这个系列的博客了,并不是对这个方
- TimeSpan 结构 表示一个时间间隔。命名空间:System 程序集:mscorlib(在 mscorlib.dll 中)说
- 引言前一段有幸参与到一个智能家居项目的开发,由于之前都没有过这方面的开发经验,所以对智能硬件的开发模式和技术栈都颇为好奇。智能可燃气体报警器
- SharedPreferences用于在开发软件的时候提供软件参数设置,其背后使用的是xml文件存放数据,文件保存在/data/data/&
- 最近做了一个项目,其中有一个在线网页交流的需求,好久没写代码了,手都生疏了,于是先写demo练练手,分享到脚本之家平台,以此做个记录,方便自
- 本文所述实例主要实现WPF项目中C#改变DataGrid某一行和单元格颜色的功能。分享给大家供大家参考。具体方法如下:如果要改变DataGr
- 1|0构造socket在【客户端/服务端】的通信模式中,客户端需要主动构造与服务器连接的 Socket,构造方法有以下几种重载形式:Sock
- 本节我们来探讨如何使用Feign构造多参数的请求。笔者以GET以及POST方法的请求为例进行讲解,其他方法(例如DELETE、PUT等)的请
- 本文实例为大家分享了C#实现学生档案查询的具体代码,供大家参考,具体内容如下using System;using System.Collec
- 上篇《Spring Aop实例之xml配置》中,讲解了xml配置方式,今天来说说AspectJ注解方式去配置spring aop。依旧采用的
- 一、Stream类概述在.NET Framework中,文件和流是有区别的。文件是存储在磁盘上的数据集,它具有名称和相应的路径。当打开一个文
- 在微服务架构中,我们将一个项目拆分成很多个独立的模块,这些独立的模块通过远程调用来互相配合工作,但是,在高并 * 况下,通信次数的增加会导致总
- 一、环境说明集群环境至少需要3个节点(也就是3台服务器设备):1个Master,2个Slave,节点之间局域网连接,可以相互ping通,下面
- 平时写项目的时候,java之父叫我们多打日志,我们通常使用traceId和requestId来保存完整请求的链路日志,例如市面上的skywa
- 一,Thread 的几个常见属性Thread 类是 JVM 用来管理线程的一个类,换句话说,每个线程都有一个唯一的 Thread 对象与之关
- 参考文章图解Java中插入排序算法的原理与实现实现效果示例代码import java.awt.*;public class AlgoVisu
- 对于跨域,相信同学们都有所了解。前端的跨域的若干种方式,大家也都知道,什么 JSONP,iframe+domain 等等。但是我们今天的主题