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事件中会卡死。
因为一个线程只能同时做一件事,这个事的范围是什么呢?
能详细描述下要做什么吗?是多个线程要执行同一个方法,在方法里面区分是哪个线程?
如果是Thread有带参数的构造ParameterizedThreadStart。传入值(object类型)就行了。或者通过Thread.CurrentThread.Name来区分。
有帮助能点个采纳吗【本回答右上角绿色按钮】,谢谢~~有其他问题可以继续问
while (b)已经进入死循环,出不来了,所以就卡死了。
首先,while 循环中在未跳出循环前,资源占用非常高,通常在多线程中,while 里面需要加个 Thread.Sleep 来延迟线程占用,避免其他窗体无法进行响应
其次,while 循环一定要设置一个跳出条件
https://ask.csdn.net/questions/7462443
你可以参考这个问题中我的回答
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);
}
}