c#中的线程导致无限循环并阻塞了我的应用程序
本文关键字:我的 应用程序 无限循环 线程 | 更新日期: 2023-09-27 18:04:03
我已经创建了一个线程,我只是从左到右移动一个单选按钮的形式。这运行,但我的应用程序得到阻塞,我不能移动表单周围,什么都没有(我认为这是创建线程的原因,使多个东西在同一时间)这是我的代码,我希望你明白我问什么。提前感谢
private void moveRight( )
{
radioButton1.Left++;
}
private void moveLeft()
{
radioButton1.Left--;
}
public void run()
{
while (true)
{
while (radioButton1.Left != this.ClientSize.Width - 10)
{
if (InvokeRequired)
{
Invoke(new MethodInvoker(moveRight));
}
else
{
moveRight();
}
}
while (radioButton1.Left != 10)
{
if (InvokeRequired)
{
Invoke(new MethodInvoker(moveLeft));
}
else
{
moveLeft();
}
}
}
}
private void button1_Click(object sender, EventArgs e)
{
t = new Thread(new ThreadStart(run));
t.Start();
}
当你在控件上调用Invoke
时,你是在告诉它在UI线程中运行提供的代码。
考虑到这一点,你的代码正在启动一个新线程,然后在这个线程中告诉UI线程去运行一堆永远运行的代码。
现在你知道为什么UI线程被阻塞了吗?
你需要在后台线程中有你的主while循环(即不在Invoke
调用内部),并限制Invoke
调用,特别是更新UI的小块代码
嗯,你的方法有几个问题:
- 你在线程中的代码永远不会结束。你有一个无限循环
- 即使你正在创建一个线程,你仍然在UI线程上运行所有的东西(使用Invoke)
这两个组合意味着你本质上是无限阻塞UI线程。
从本质上讲,这样的:
while (true)
{
while (radioButton1.Left != this.ClientSize.Width - 10)
{
moveRight();
}
while (radioButton1.Left != 10)
{
moveLeft();
}
}
永远不会结束。由于它是在UI线程上调用的,UI将被无限期阻塞,而只是更新控件的左坐标,而没有任何实际呈现。