欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

winform基于异步委托实现多线程摇奖器

程序员文章站 2023-12-18 17:54:28
本文实例讲述了winform基于异步委托实现多线程摇奖器。分享给大家供大家参考。具体实现方法如下: 复制代码 代码如下:using system; using syst...

本文实例讲述了winform基于异步委托实现多线程摇奖器。分享给大家供大家参考。具体实现方法如下:

复制代码 代码如下:
using system;
using system.collections.generic;
using system.componentmodel;
using system.data;
using system.drawing;
using system.linq;
using system.text;
using system.threading;
using system.threading.tasks;
using system.windows.forms;

namespace _08_摇奖机
{
//创建六个invoke方法(控件调用的时候的委托,用来给lable控件赋值)
public delegate void mydelegate1(int num);
public delegate void mydelegate2(int num);
public delegate void mydelegate3(int num);
public delegate void mydelegate4(int num);
public delegate void mydelegate5(int num);
public delegate void mydelegate6(int num);
public partial class form1 : form
{
public mydelegate1 md1;
public mydelegate1 md2;
public mydelegate1 md3;
public mydelegate1 md4;
public mydelegate1 md5;
public mydelegate1 md6;
//此委托用来作异步委托,旨在让clr自动创建另一个线程来完成主线程要做的操作,以缓解主线程的压力
public delegate void mydelegate(bool b);
public form1()
{
initializecomponent();
md1 = setlable1;
md2 = setlable2;
md3 = setlable3;
md4 = setlable4;
md5 = setlable5;
md6 = setlable6;
}
//用来存放子线程对象
private thread namethread;
private int id;
private void button1_click(object sender, eventargs e)
{
mydelegate md = new mydelegate(this.setnumberdata);;
if (button1.text.trim()=="开始")
{
button1.text = "停止";
//调用异步委托,就是在另一个线程中执行此委托绑定的方法
iasyncresult result = md.begininvoke(true,null, null);
}
else
{
button1.text = "开始";
//停止的话就相当于终止子线程
namethread.abort();
}

//首先要想清楚 要给主线程的空间lable赋值,那么就必须是主线程干的事

//md.endinvoke(result);
}

public void setnumberdata(bool b)
{
while (b==true)
{
list<int> listnum = new list<int>();
random random = new random();
//随机生成6个数
while (listnum.count <= 6)
{
int n = 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;

}

public void setlable1(int n)
{
label1.text = n.tostring();
}
public void setlable2(int n)
{
label2.text = n.tostring();
}
public void setlable3(int n)
{
label3.text = n.tostring();
}
public void setlable4(int n)
{
label4.text = n.tostring();
}
public void setlable5(int n)
{
label5.text = n.tostring();
}
public void setlable6(int n)
{
label6.text = n.tostring();
}
}

程序运行结果如下所示:

winform基于异步委托实现多线程摇奖器

希望本文所述对大家的c#程序设计有所帮助。

上一篇:

下一篇: