当前位置: 移动技术网 > IT编程>开发语言>c# > winform基于异步委托实现多线程摇奖器

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

2019年07月18日  | 移动技术网IT编程  | 我要评论
本文实例讲述了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();
}
}

程序运行结果如下所示:

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

如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网