应用多线程做一个摇奖的小程序
基本内容是有6个label标签显示随机数字,
点击启动摇奖,开启摇奖线程,
点击停止,关闭线程
下面是全部源代码
//控制是否停止
bool isRuning = false;
//创建一个集合来存放label,方便线程的访问
List<Label> label = new List<Label>();
private void Form1_Load(object sender, EventArgs e)
{
//使用代码创建6个label标签
for (int i = 0; i < 6; i++)
{
Label lb = new Label();
//自适应
lb.AutoSize = true;
lb.Text = "0";
//设置位置
lb.Location = new Point(50 + i * 50, 80);
label.Add(lb);
this.Controls.Add(lb);
}
}
//启动摇奖
private void button1_Click(object sender, EventArgs e)
{
isRuning = true;
//创建线程来改变label的值
Thread thread = new Thread(() =>
{
//不断地改变
Random random = new Random();
// MessageBox.Show(this.Text);
while (isRuning)
{
foreach (var item in label)
{
var str = random.Next(1, 23).ToString();
if (item.InvokeRequired)
{
item.Invoke(new Action<string>(s=>{item.Text=s;}),str);
}
else
{
item.Text = str;
}
}
Thread.Sleep(200);
}
});
thread.IsBackground = true;
thread.Start();
}
//关闭
private void button2_Click(object sender, EventArgs e)
{
isRuning = false;
}
这里有几个需要注意的点:
(1)
List<Label> label = new List<Label>();
将创建的label放在集合中,课以方便下面线程的操控
(2)
bool isRuning = false;
用这个变量可以
控制线程中While的进入与跳出,即开启与关闭
(3)
if (item.InvokeRequired)
使用这句可以解决跨线程访问控件的问题,
在里面调用Invoke方法,就可以用一个委托调用别的线程中的控件了