開始畫面
抽獎中:
抽獎結果:
需要一個隨機數Random的幫助類,讓隨機數唯一性
public class RandomHelper { public int GetNum(int min, int max) { Thread.Sleep(1000);//隨機休息1秒 return GetIntNum(min,max); } /// <summary> /// 獲取隨機數,解決重復問題 /// </summary> /// <param name="min">返回的隨機數字包含下限</param> /// <param name="max">返回的隨機數字不包含上限</param> /// <returns></returns> private int GetIntNum(int min,int max) { Guid Guidnum = Guid.NewGuid(); string guid = Guidnum.ToString(); int seed = DateTime.Now.Millisecond; for (int i = 0; i < guid.Length; i++) { switch (guid[i]) { case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': case 'g': seed = seed + 1; break; case 'h': case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': seed = seed + 2; break; case 'o': case 'p': case 'q': case 'r': case 's': case 't': seed = seed + seed; break; case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': seed = seed + 3; break; default: seed = seed + 4; break; } } return new Random(seed).Next(min,max); }
Form的 代碼編寫
先要放2個
public Form1() { InitializeComponent(); IsBegin = true; this.btnEnd.Enabled = false; } /// <summary> /// 標識是否開始搖獎 /// </summary> private static bool IsBegin = true; private string[] RedNum = { "01","02","03","04","05","06","07","08","09","10","11","12","13", "14","15","16","17","18","19","20","21","22","23","24","25","26", "27","28","29","30","31","32","33" }; private string[] BuleNum = { "01","02","03","04","05","06","07","08","09","10","11","12","13", "14","15","16" }; private void btnStart_Click(object sender, EventArgs e) { TaskFactory taskFactory = new TaskFactory(); List<Task> taskList = new List<Task>(); IsBegin = true; this.btnStart.Enabled = false; // Thread.Sleep(1000); this.btnEnd.Enabled = true; foreach (Control item in gBox.Controls) { if (item is Label) { Label lbl = (Label)item; taskList.Add(taskFactory.StartNew( () => { while (IsBegin) { this.UpdateNum(lbl); } })); } } taskFactory.ContinueWhenAll(taskList.ToArray(),tList=>this.ShowNumber());//等所有線程操作完畢后才顯示中獎號。 } /// <summary> /// 鎖 /// </summary> private static readonly object Num_Lock = new object(); private void UpdateNum(Label lbl) { RandomHelper randomHelper = new RandomHelper(); if (lbl.Name.Contains("Blue")) { int num = randomHelper.GetNum(0,16); string blueText = BuleNum[num]; this.UpdateLbl(lbl, blueText); } else { int num = randomHelper.GetNum(0, 33); string redText = RedNum[num]; lock (Num_Lock) { List<string> list = this.GetLabelList(); if (list.Contains(redText)) { return; } else { this.UpdateLbl(lbl,redText); } } } } /// <summary> /// 獲取當前已經抽出的雙色球,防止重復 /// </summary> /// <returns>所有控件的值</returns> private List<string> GetLabelList() { List<string> strList = new List<string>(); foreach (Control item in gBox.Controls) { if (item is Label) { Label label = (Label)item; strList.Add(label.Text); } } return strList; } /// <summary> /// 通過主線程修改UI /// </summary> /// <param name="lbl">修改的Label</param> /// <param name="text">修改的值</param> private void UpdateLbl(Label lbl, string text) { if (lbl.InvokeRequired) { this.Invoke(new Action(() => { lbl.Text = text; //Thread.Sleep(2000); //Console.WriteLine($"當前UpdateLbl線程id{Thread.CurrentThread.ManagedThreadId}"); }));//交給UI線程去更新 } else { lbl.Text = text; } } /// <summary> /// 結束抽獎,開獎 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnEnd_Click(object sender, EventArgs e) { if (!this.GetLabelList().Contains("00")) { IsBegin = false; this.btnEnd.Enabled = false; this.btnStart.Enabled = true; } else { MessageBox.Show("請慢一點,稍后再試"); } } private void ShowNumber() { MessageBox.Show(string.Format("本期雙色球結果是 {0} {1} {2} {3} {4} {5} {6}", lbRed1.Text, lbRed2.Text, lbRed3.Text, lbRed4.Text, lbRed5.Text, lbRed6.Text, lbBlue.Text)); } }