C# 根据自定义线程定时器 生成随机订单
这个源之于一个朋友问我的一个问题,他说他们的需求是在一天之内随机抽取数据生成订单,还不能让客户看出来。
随机生成的订单还分概率抽取不一定的状态值,那么根据我之前写的定时器线程执行器,我们设计需要一个定时器去执行。
那么我们的定时器坑定需要一直运行,包括每天的情况。
创建 SecondsTimerTask 由于是测试条件下,我们声明5秒运行一次
1 /// <summary> 2 /// 每秒执行的任务 3 /// </summary> 4 public class SecondsTimerTask : TimerTaskBase 5 { 6 /// <summary> 7 /// 定义一秒执行一次的 8 /// </summary> 9 public SecondsTimerTask() 10 : base(0, 1000, false) 11 { 12 13 } 14 15 List<int> ints1 = new List<int>() { 1, 2, 3, 4, 5 }; 16 List<int> ints2 = new List<int>() { 6, 7, 8, 9, 10 }; 17 18 string _ActionDay = string.Empty; 19 int _ActionCount = 0; 20 21 public override void Run() 22 { 23 string day = DateTime.Now.ToString("yyyy/MM/dd"); 24 if (!day.Equals(_ActionDay)) 25 { 26 //如果是非本日情况,重置条件 27 //可以根据自身的条件完成 28 ints1 = new List<int>() { 1, 2, 3, 4, 5 }; 29 ints2 = new List<int>() { 6, 7, 8, 9, 10 }; 30 _ActionDay = day; 31 _ActionCount = 0; 32 } 33 if (_ActionCount == 5) 34 { 35 Console.WriteLine(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss:ffff: ") + "随机生成订单 今日任务完成"); 36 return; 37 } 38 int ran = new Random(DateTime.Now.Millisecond).Next(0, 100000);//用0到10万为随机界限标准 39 if (ran < 70000)//70%的概率这次执行需要生产订单 40 { 41 _ActionCount++; 42 int ranNext = new Random(DateTime.Now.Millisecond).Next(0, 100000);//用0到10万为随机界限标准 43 if (ranNext > 40000) 44 { 45 //60%的概率 46 int index = new Random(DateTime.Now.Millisecond).Next(0, ints1.Count); 47 int item = ints1[index]; 48 Console.WriteLine(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss:ffff: ") + "随机生成订单60%的概率: " + item); 49 ints1.RemoveAt(index); 50 } 51 else 52 { 53 ///40%的概率 54 int index = new Random(DateTime.Now.Millisecond).Next(0, ints2.Count); 55 int item = ints2[index]; 56 Console.WriteLine(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss:ffff: ") + "随机生成订单40%的概率: " + item); 57 ints2.RemoveAt(index); 58 } 59 } 60 else 61 { 62 Console.WriteLine(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss:ffff: ") + " 根据随机情况不生成订单"); 63 } 64 } 65 }
请结合定时器线程章节,
1 class Program 2 { 3 4 static void Main(string[] args) 5 { 6 TimerThread timerThread = new TimerThread(); 7 timerThread.AddTask(new SecondsTimerTask()); 8 Console.ReadLine(); 9 } 10 }
我们来看看结果
上面的运行结果,大家注意时间,我是在今日任务完成的情况下,我直接修改系统时间为第二天,然后继续第二天的任务
这样就保证了程序如果一直在运行的情况下,完成每日的生成订单的量。
但是需要注意的是,我没有考虑如果程序重启的情况,需要各位根据各自的情况进行修改~!
跪求保留标示符 /** * @author: Troy.Chen(失足程序员, 15388152619) * @version: 2021-07-20 10:55 **/ C#版本代码 vs2010及以上工具可以 java 开发工具是netbeans 和 idea 版本,只有项目导入如果出现异常,请根据自己的工具调整 提供免费仓储。 最新的代码地址:↓↓↓ https://gitee.com/wuxindao 觉得我还可以,打赏一下吧,你的肯定是我努力的最大动力