创建 Winform 项目并设计界面

编写代码实现切换逻辑
using System;
using System.Threading;
using System.Windows.Forms;

namespace _02_多线程传参案例
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            // 关闭跨线程访问
            Control.CheckForIllegalCrossThreadCalls = false;
        }
        // 抽奖名字列表
        string[] names = { "王五", "赵六", "孙七", "周八", "吴九", "郑十", "钱一", "冯二", "陈三", "褚四", "卫五", "蒋六", "沈七", "韩八", "杨九", "朱十", "秦一", "尤二", "许三", "何四" };
        
        // 保存抽奖线程的变量
        private Thread thread;
        // 创建随机对象
        Random random = new Random();

        // 定义一个线程的“开关”(true=运行,false=停止)
        private bool flag = false;

        // 开始抽奖
        private void button1_Click(object sender, EventArgs e)
        {
            if (!flag)
            {
                // 新建线程,指定执行ShowNames方法,并传入names数组作为参数
                thread = new Thread(ShowNames);
                thread.Start(names);
                button1.Text = "停止"; // 按钮文本改成“停止”
                flag = true; // 打开线程开关
            }
            else
            {
                button1.Text = "开始抽奖"; // 按钮文本改回“开始”
                flag = false; // 关闭线程开关(线程会自动退出循环)
            }
        }
        // 线程执行的方法:循环刷新Label显示名字
        private void ShowNames(object obj)
        {
            // 将传入的参数转为string[]类型
            string[] names = obj as string[];
            while (true)
            {
                // 开关等于false
                if (!flag)
                {
                    break;
                }
                // 从数组中随机抽取三个人名
                string name1 = "";
                string name2 = "";
                string name3 = "";
                while (true)
                {
                    name1 = names[random.Next(names.Length)];
                    name2 = names[random.Next(names.Length)];
                    name3 = names[random.Next(names.Length)];
                    if (!name1.Equals(name2) && !name1.Equals(name3) && !name2.Equals(name3))
                    {
                        break;
                    }
                }
                // 赋值
                label1.Text = name1;
                label2.Text = name2;
                label3.Text = name3;
                Thread.Sleep(188);
            }
        }

        // 窗口关闭事件
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (thread != null)
            {
                thread.Abort();// 终止
            }
        }
    }
}
测试演示

希望对大家有所帮助。感谢大家的关注和点赞。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐