哆啦菜
2021-07-07 16:02
采纳率: 100%
浏览 69

在学习c#的时候学到进程和线程,线程同一时间只能做一个事务。请问怎么区分是两个事务

    private void button1_Click(object sender, EventArgs e)
    {
        Thread th = new Thread(PlayGame);
        th.IsBackground = true;
        th.Name = "newthread";
        th.Start();
        if (button1.Text == "开始")
        {
            button1.Text = "停止";
            b = true;
        }
        else
        {
            button1.Text = "开始";
            b = false;                
        }

    }
    public void  PlayGame()
    {
        while (b)
        {
            Random r = new Random();
            label1.Text = r.Next(0, 10).ToString();
            label2.Text = r.Next(0, 10).ToString();
            label3.Text = r.Next(0, 10).ToString();
        }
    }

我试着把下面函数部分的代码我不写函数,也不分配线程,直接当过程写到click事件中会卡死。
因为一个线程只能同时做一件事,这个事的范围是什么呢?

  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

4条回答 默认 最新

  • CSDN专家-showbo 2021-07-07 16:35
    已采纳

    能详细描述下要做什么吗?是多个线程要执行同一个方法,在方法里面区分是哪个线程?
    如果是Thread有带参数的构造ParameterizedThreadStart。传入值(object类型)就行了。或者通过Thread.CurrentThread.Name来区分。
    有帮助能点个采纳吗【本回答右上角绿色按钮】,谢谢~~有其他问题可以继续问

    已采纳该答案
    评论
    解决 无用
    打赏 举报
  • while (b)已经进入死循环,出不来了,所以就卡死了。

    评论
    解决 无用
    打赏 举报
  • CSDN专家-文盲老顾 2021-07-07 21:11

    首先,while 循环中在未跳出循环前,资源占用非常高,通常在多线程中,while 里面需要加个 Thread.Sleep 来延迟线程占用,避免其他窗体无法进行响应

    其次,while 循环一定要设置一个跳出条件

    https://ask.csdn.net/questions/7462443

    你可以参考这个问题中我的回答

    评论
    解决 无用
    打赏 举报
  • 纯阳真人 2021-07-08 11:08

    while循环一直在占用CPU,没有给其他线程使用cpu的机会,cpu一个时刻只能干一件事,你的while循环一直占着不放开,别的线程就一直没办法执行。你执行其他动作的时候,需要cpu资源,但cpu又被你的while霸占这,他就会一直等,就算等不到也会继续等,结果就是程序卡死。在while中加个Thread.Sleep(1)就行了,这句代码主要目的不是为了挂起while循环线程,而是为了让他短暂交出cpu使用权,这样你的其他动作就有机会拿到cpu资源,就能执行了。
    还有就是你的线程启动位置不对,要放在if里面:

         private void button1_Click(object sender, EventArgs e)
        {
           
            if (button1.Text == "开始")
            {
                button1.Text = "停止";
                b = true;
                Thread th = new Thread(PlayGame);
                th.IsBackground = true;
                th.Name = "newthread";
                th.Start();
            }
            else
            {
                button1.Text = "开始";
                b = false;                
            }
        }
        public void  PlayGame()
        {
            while (b)
            {
                Random r = new Random();
                label1.Text = r.Next(0, 10).ToString();
                label2.Text = r.Next(0, 10).ToString();
                label3.Text = r.Next(0, 10).ToString();
                Thread.Sleep(1);
            }
        }
    
    
    
    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题