首页 > 编程语言 >C#基础-----------线程的使用

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

时间:2024-08-29 15:58:12浏览次数:6  
标签:抢座 Thread thread C# void ----------- 线程 座位数

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

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();

 }

三、问题解决

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

解决方法 

标签:抢座,Thread,thread,C#,void,-----------,线程,座位数
From: https://blog.csdn.net/m0_70785017/article/details/141680006

相关文章

  • Pytorch 中的 优化器
    1.介绍torch.optim是PyTorch库中的一个优化器模块,用于实现各种优化算法。优化器模块提供了一系列优化算法,如随机梯度下降(SGD)、Adam、Adagrad等。这些优化算法用于调整神经网络的权重和学习率,以最小化损失函数。通过优化算法,可以帮助神经网络更快地收敛到最优解,提高训练效......
  • 无人机驾驶员培训——学习CAAC的必要性
    无人机驾驶员培训中,学习并考取CAAC(中国民用航空局)无人机执照的必要性主要体现在以下几个方面:一、合法合规飞行的前提法律要求:在中国,进行商业无人机飞行活动必须持有有效的无人机驾驶员执照。CAAC无人机执照是合法合规飞行的必要条件,确保驾驶员具备必要的飞行知识和技能,从而保......
  • Pytorch 的 损失函数
    1.损失函数损失函数(LossFunction)是用来衡量模型预测结果与真实值之间的差异的函数。它是训练过程中最重要的组成部分之一,用来指导模型的优化过程。 作用损失函数的作用包括:衡量模型性能:通过计算预测结果与真实值的差异,损失函数可以提供一个衡量模型预测准确性的指标......
  • CAAC无人机执照:人才岗位需求分析
    CAAC无人机执照作为无人机行业从业者的重要资质,其持有者在市场上具有广泛的就业前景和多样化的岗位需求。以下是对CAAC无人机执照持有人才岗位需求的详细分析:一、岗位需求背景随着无人机技术的快速发展和广泛应用,无人机行业市场规模持续扩大。据中投产业研究院发布的报告,中......
  • Pytorch 中的 Sequential
    1.介绍在PyTorch中,Sequential是一个模型容器。它是一个用于顺序排列神经网络模块(如层、激活函数等)的容器。通过使用Sequential,可以将多个模块按照顺序连接在一起,构建一个深度神经网络模型。使用Sequential时,可以将每个模块按照顺序添加到Sequential容器中。每个模块都可以......
  • delphi操作excell文件实现学生均衡分班
    unitUnit1;interfaceusesWinapi.Windows,Winapi.Messages,System.SysUtils,System.Variants,System.Classes,Vcl.Graphics,Vcl.Controls,Vcl.Forms,Vcl.Dialogs,Vcl.StdCtrls,System.Win.ComObj;typeTForm1=class(TForm)Button1:TButton;......
  • 「杂题乱刷2」CF862D
    简单题。题目链接CF862DMahmoudandEhabandthebinarystring解题思路首先我们可以发现,字符串的第一个字母不是\(1\)就是\(0\),因此我们可以容易花费\(2\)次询问来找到数字\(0\)或数字\(1\)所在的一个位置。然后,显然的,我们以先找到的数字为\(0\)为例,那么我们就......
  • Mybatis-puls中select查询方法返回为空null
    1、项目参数springboot2.6.13jdk8Mybatis-Plus3.5.42、问题描述在3.5.4版本的MP中使用select方法查询到数据,却返回为空实体类publicclassFlower{@TableId(value="flower_id",type=IdType.INPUT)privateintflower_id;privateStringflower_name;......
  • 【vue3】探讨为什么ref()换为reactive()数据不再是响应式?
    原问题:本来想使用数组中的filter方法,原来用的是lettableData=ref([])然后发现Ref上不再filter属性,所以就换成了lettableData=reactive([])但是这样有了一个新问题就是:数据加载不出来了,代码如下//获取文章列表数据 lettableData=reactive([]) functiongetArt......
  • Android 开发兼容性问题,TaskExecutionException等问题。
    1、问题描述:kapt'com.github.bumptech.glide:compiler:4.12.0'org.gradle.api.tasks.TaskExecutionException:Executionfailedfortask':app:kaptJlbDebugKotlin'.2、问题分析: 如果多人协作开发,从仓库clone\下载的项目代码,就说明其他开发人员使用这套代码是可以......