C#基础-----------线程的使用

一、代码练习————抢座系统

1.交互界面

2.代码部分

设置label1显示的文本信息,座位数量,我这里设置的座位数量是3个,最重要的是NEW一个锁(lock)避免多个对象同时抢同一个座位,造成出现座位数为负数的情况

编写抢票函数,运用锁来避免特殊情况(多个对象同时对一个座位进行抢夺)。

思路:用IF语句进行判断当前剩余座位数,当第一个对象进入系统时,启动锁来锁定系统,当他成功抢到座位时,座位数减一,并且输出抢座成功,反之输出抢座失败。

void GrabSeat()
{
   lock(suo)
    {
        if (seat > 0)
        {
            Thread.Sleep(1000);
            seat--;
            //Console.WriteLine("抢座成功,当前座位数为:>{0}", seat);
            Console.WriteLine(Thread.CurrentThread.Name + "抢座成功Success");
        }
        else
        {
            //Console.WriteLine("抢座失败,当前座位数为:>{0}", seat);
            Console.WriteLine(Thread.CurrentThread.Name + "抢座失败Fail");
        }
    }  
}

双击button1进入点击事件

设定10个人同时进行抢座,并且定义一个变量,能让我们清楚的知道那个对象抢到了座位。new了一个线程时,就必须要启动线程 thread.Start();

private void button1_Click(object sender, EventArgs e)
{
    for (int i = 1; i < 11; i++)
    {
        int index = i;
        Thread thread = new Thread(GrabSeat);
        //Thread thread = new Thread(() =>
        //{
        //    GrabSeat();
        //});
        thread.Name = "ID" + index.ToString();
        thread.Start();
    }
}

双击button2进入点击事件,用于显示label1的文本消息

private void button2_Click(object sender, EventArgs e)
{
    label1.Text = "当前座位数:>" + seat.ToString();
}

二、线程的开启和关闭

定义两个按钮,一个用于开启线程,一个用于关闭线程,label的作用这是显示文本信息,便于让我们了解线程是否开启和关闭。

注意:其中的label数量是两个

生成一个点击事件,定义一个线程和一个布尔值,用于开启和关闭线程

本段代码为实现计数功能

因为此代码和上段代码是在同一个文件下编写的,所以线程数量不再是单独的一个,而button3中实现的功能虽然编写在子线程中,但是运行却是在主线程中,因此需要用到this.InvokeRequired来判断当前线程和我的主线程是否安全。

Thread thread;
bool flag = true;
private void button3_Click(object sender, EventArgs e)
{
    int a = 0;
    thread = new Thread(() =>
    {
        //直接写要执行的逻辑
        while (flag)
        {
            a++;
            //this.InvokeRequired判断当前线程和我的主线程是否安全
            //如果是true不安全,反之
            if (this.InvokeRequired)
            {
                //委托主线程帮忙修改
                this.Invoke(new Action(() =>
                {
                    label3.Text = a.ToString();
                }));
                //睡眠放到主线程里面会造成阻塞
                Thread.Sleep(200);
            }
            else
            {
                label3.Text = a.ToString();
                Thread.Sleep(200);
            }
        }
    });
    thread.Name = "我是子线程";
    thread.Start();
}

button4用于关闭线程。

定义的布尔值bool flag = true;用于开启和关闭,当点击 button4时flag的值变为false,同时加入thread.Abort();使得线程能安全的关闭。

 private void button4_Click(object sender, EventArgs e)
 {
     //关闭线程
     //
     flag = false;
     thread.Abort();

 }

三、问题解决

如果运行代码时没有出现调试框

解决方法 

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值