这个源之于一个朋友问我的一个问题,他说他们的需求是在一天之内随机抽取数据生成订单,还不能让客户看出来。
随机生成的订单还分概率抽取不一定的状态值,那么根据我之前写的定时器线程执行器,我们设计需要一个定时器去执行。
那么我们的定时器坑定需要一直运行,包括每天的情况。
创建 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 else52 {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 else61 {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 }
我们来看看结果
上面的运行结果,大家注意时间,我是在今日任务完成的情况下,我直接修改系统时间为第二天,然后继续第二天的任务
这样就保证了程序如果一直在运行的情况下,完成每日的生成订单的量。
但是需要注意的是,我没有考虑如果程序重启的情况,需要各位根据各自的情况进行修改~!