這個源之於一個朋友問我的一個問題,他說他們的需求是在一天之內隨機抽取數據生成訂單,還不能讓客戶看出來。
隨機生成的訂單還分概率抽取不一定的狀態值,那麼根據我之前寫的定時器線程執行器,我們設計需要一個定時器去執行。
那麼我們的定時器坑定需要一直運行,包括每天的情況。
創建 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 (ran > 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 }
我們來看看結果

上面的運行結果,大家注意時間,我是在今日任務完成的情況下,我直接修改系統時間為第二天,然後繼續第二天的任務
這樣就保證了程序如果一直在運行的情況下,完成每日的生成訂單的量。
但是需要注意的是,我沒有考慮如果程序重啟的情況,需要各位根據各自的情況進行修改~!