2

我创建了一个线程,在其中我只是将一个单选按钮从表单的左侧移动到右侧。这运行了,但是我的应用程序被阻塞了,我不能移动表单,什么都没有(我认为这是创建线程的原因,同时做多个事情)这是我的代码,我希望你明白我的意思问。提前致谢

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

2 回答 2

7

当您调用Invoke控件时,您是在告诉它在 UI 线程中运行提供的代码。

鉴于此,您的代码正在启动一个新线程,然后在该线程中告诉 UI 线程去运行一堆永远运行的代码。

现在你明白为什么我希望 UI 线程被阻塞了吗?

您需要在后台线程(即不在Invoke调用内部)中有您的主要 while 循环,并将调用限制Invoke为专门用于更新 UI 的小代码块。

于 2013-03-15T19:39:12.727 回答
0

好吧,您的方法存在一些问题:

  1. 你在线程中的代码永远不会结束..你有一个无限循环
  2. 即使您正在创建一个线程,您仍然在 UI 线程上运行所有内容(使用 Invoke)

这两个组合意味着您基本上无限阻塞了 UI 线程。

本质上,这是:

while (true)
{
    while (radioButton1.Left != this.ClientSize.Width - 10)
    {
        moveRight();
    }
    while (radioButton1.Left != 10)
    {
        moveLeft();
    }
}

永远不会结束。而且由于它是在 UI 线程上调用的,所以 UI 将被无限期地阻塞,而只是更新控件的左坐标,而实际上没有任何东西被渲染。

于 2013-03-15T19:39:46.500 回答