winform基于异步委托实现多线程摇奖器
本文实例讲述了winform基于异步委托实现多线程摇奖器。分享给大家供大家参考。具体实现方法如下:
usingSystem; usingSystem.Collections.Generic; usingSystem.ComponentModel; usingSystem.Data; usingSystem.Drawing; usingSystem.Linq; usingSystem.Text; usingSystem.Threading; usingSystem.Threading.Tasks; usingSystem.Windows.Forms;
namespace_08_摇奖机 { //创建六个invoke方法(控件调用的时候的委托,用来给lable控件赋值) publicdelegatevoidMyDelegate1(intnum); publicdelegatevoidMyDelegate2(intnum); publicdelegatevoidMyDelegate3(intnum); publicdelegatevoidMyDelegate4(intnum); publicdelegatevoidMyDelegate5(intnum); publicdelegatevoidMyDelegate6(intnum); publicpartialclassForm1:Form { publicMyDelegate1md1; publicMyDelegate1md2; publicMyDelegate1md3; publicMyDelegate1md4; publicMyDelegate1md5; publicMyDelegate1md6; //此委托用来作异步委托,旨在让clr自动创建另一个线程来完成主线程要做的操作,以缓解主线程的压力 publicdelegatevoidMyDelegate(boolb); publicForm1() { InitializeComponent(); md1=SetLable1; md2=SetLable2; md3=SetLable3; md4=SetLable4; md5=SetLable5; md6=SetLable6; } //用来存放子线程对象 privateThreadnameThread; privateintid; privatevoidbutton1_Click(objectsender,EventArgse) { MyDelegatemd=newMyDelegate(this.SetNumberData);; if(button1.Text.Trim()=="开始") { button1.Text="停止"; //调用异步委托,就是在另一个线程中执行此委托绑定的方法 IAsyncResultresult=md.BeginInvoke(true,null,null); } else { button1.Text="开始"; //停止的话就相当于终止子线程 nameThread.Abort(); }
//首先要想清楚要给主线程的空间lable赋值,那么就必须是主线程干的事
//md.EndInvoke(result); }
publicvoidSetNumberData(boolb) { while(b==true) { List<int>listNum=newList<int>(); Randomrandom=newRandom(); //随机生成6个数 while(listNum.Count<=6) { intn=random.Next(0,10); listNum.Add(n); } //不是创建此控件的线程调用此控件的时候就必须调用invoke方法 if(this.label1.InvokeRequired) { this.Invoke(md1,listNum[0]); } else { label1.Text=listNum[0].ToString(); } if(this.label2.InvokeRequired) { this.Invoke(md2,listNum[1]); } else { label2.Text=listNum[1].ToString(); } if(this.label3.InvokeRequired) { this.Invoke(md3,listNum[2]); } else { label3.Text=listNum[2].ToString(); } if(this.label4.InvokeRequired) { this.Invoke(md4,listNum[3]); } else { label4.Text=listNum[3].ToString(); } if(this.label5.InvokeRequired) { this.Invoke(md5,listNum[4]); } else { label5.Text=listNum[4].ToString(); } if(this.label6.InvokeRequired) { this.Invoke(md6,listNum[5]); } else { label6.Text=listNum[5].ToString(); } //记录下当前的线程对象,以便于在点击停止按钮的时候终止此线程 nameThread=Thread.CurrentThread; Thread.Sleep(300); } //id=Thread.CurrentThread.ManagedThreadId;
}
publicvoidSetLable1(intn) { label1.Text=n.ToString(); } publicvoidSetLable2(intn) { label2.Text=n.ToString(); } publicvoidSetLable3(intn) { label3.Text=n.ToString(); } publicvoidSetLable4(intn) { label4.Text=n.ToString(); } publicvoidSetLable5(intn) { label5.Text=n.ToString(); } publicvoidSetLable6(intn) { label6.Text=n.ToString(); } }