多任务顺序执行解决方案
时间:2021-08-14
本文章向大家介绍多任务顺序执行解决方案,主要包括多任务顺序执行解决方案使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
多任务顺序执行解决方案
解决思路分为四部分:
-
创建所有任务的基类:CommandBase
-
创建单个任务类:Command
-
创建任务集合类:CommandCollection
-
创建任务管理中心,对所有任务的运行状态进行管理:CommandHerper
具体实现
CommandBase
public abstract class CommandBase
{
public abstract void Execute(ref bool isStop);
}
Command
public class Command : CommandBase
{
public string Data { get; set; }
public int Delay { get; set; }
public override void Execute(ref bool isStop)
{
if (Delay > 0) Thread.Sleep(this.Delay);
Console.WriteLine($"正在执行任务:{Data} 延时:{Delay}秒");
}
}
CommandCollection
public class CommandCollection : Command
{
public List<Command> Commands { get; private set; }
public CommandCollection(List<Command> commands)
{
Commands = commands;
}
public override void Execute(ref bool isStop)
{
if (Commands.Count == 0) return;
Console.WriteLine($"任务队列开始执行");
foreach (var cmd in Commands)
{
if (isStop)
{
Commands.Clear();
return;
}
cmd.Execute(ref isStop);
}
Console.WriteLine($"任务队列执行结束");
}
}
CommandHerper
public static class CommandHelper
{
public static Queue<CommandBase> CommandQueue = new Queue<CommandBase>();
public static bool Running, Stopped, IsCycle;
public static Thread CmdThread;
public static Task CmdTask;
public static void AddCommand(CommandBase cmd)
{
lock (CommandQueue)
{
CommandQueue.Enqueue(cmd);
}
}
public static void Start()
{
if (Running) return;
Stopped = false;
Running = true;
//CmdTask = new Task(ProcessCommandTask);
//CmdTask.Start();
CmdThread = new Thread(ProcessCommandTask);
CmdThread.Start();
}
public static void Stop()
{
if (Running)
{
Stopped = true;
Running = false;
try
{
#pragma warning disable 618
if (CmdThread != null) CmdThread.Abort();
#pragma warning restore 618
}
catch (Exception e)
{
Console.WriteLine(e);
throw;
}
}
}
private static void ProcessCommandTask()
{
while (!Stopped)
{
CommandBase cmd;
lock (CommandQueue)
{
if (CommandQueue.Count > 0)
{
cmd = CommandQueue.Dequeue();
}
else
{
break;
}
}
if (cmd == null)
{
Thread.Sleep(10);
}
else
{
try
{
do
{
cmd.Execute(ref Stopped);
} while (IsCycle && !Stopped);
}
catch (Exception e)
{
Console.WriteLine(e);
lock (CommandQueue)
{
CommandQueue.Clear();
}
break;
}
}
}
}
}
Program
private static void CreateCommand()
{
List<CommandCollection> cmdr = new List<CommandCollection>()
{
new CommandCollection(new List<Command>()
{
new Command(){Data = "跑步的第一个任务",Delay = 5000},
new Command(){Data = "跑步的第二个任务",Delay = 200},
new Command(){Data = "跑步的第三个任务",Delay = 1000}
}),
new CommandCollection(new List<Command>()
{
new Command(){Data = "游泳的第一个任务",Delay = 3000},
new Command(){Data = "游泳的第二个任务",Delay = 2000},
new Command(){Data = "游泳的第三个任务",Delay = 1000}
})
};
foreach (var cmd in cmdr)
{
CommandHelper.AddCommand(cmd);
}
}
private static void Main()
{
Console.WriteLine("Hello World!");
CreateCommand();
//CommandHelper.IsCycle = true;
CommandHelper.Start();
Console.Read();
}
登峰造极的成就源于自律
原文地址:https://www.cnblogs.com/fishpond816/p/15140468.html
- 国内自动驾驶企业在美国首秀其最新L4级自动驾驶货运卡车
- Nginx源码安装及调优配置
- Greenplum 简单性能测试与分析
- CentOS6 安装couchdb2 集群
- 如何遍历维数和各维上限未定的多维数组
- 求长度的另一种方法(""+obj).Length
- ASP.NET MVC的客户端验证:jQuery验证在Model验证中的实现
- GreenPlum 简单性能测试与分析(续)
- 最终版 Reflector v1.0 (+简单的反流程混淆)
- 性能&分布式&NewLife.XCode对无限数据的支持
- ASP.NET MVC下的异步Action的定义和执行原理
- 包学会之浅入浅出Vue.js:结业篇
- 迈克尔•戴尔:人工智能杀手?技术反乌托邦?不存在的
- 你知道吗?多个类多线程环境下静态构造函数的执行顺序
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法