我创建了一个Thread,我只需要从表单的左侧移动一个radiobutton。 这运行,但我的应用程序被阻止,我无法移动表单,没有(我认为这是创建线程的原因,同时做多个事情) 这是我的代码,我希望你理解我的要求。提前致谢
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();
}
答案 0 :(得分:7)
当您在控件上调用Invoke
时,您告诉它在UI线程中运行提供的代码。
鉴于此,您的代码正在启动一个新线程,然后在该线程中告诉UI线程运行一堆永远运行的代码。
现在你明白为什么UI线程被封锁了我希望?
您需要在后台线程中使用主要的while循环(即不在Invoke
调用内部)并将Invoke
调用限制为更新UI的小代码块。
答案 1 :(得分:0)
嗯,您的方法存在一些问题:
这两个组合意味着你基本上无限制地阻止了UI线程。
基本上,这个:
while (true)
{
while (radioButton1.Left != this.ClientSize.Width - 10)
{
moveRight();
}
while (radioButton1.Left != 10)
{
moveLeft();
}
}
永远不会结束。并且由于它是在UI线程上调用的,因此只需更新控件的Left坐标,UI就会被无限期阻塞,而不会实际呈现任何内容。