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