C#中的线程导致无限循环并阻塞我的应用程序

时间:2013-03-15 19:37:00

标签: c#

我创建了一个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();
    }

2 个答案:

答案 0 :(得分:7)

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

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

现在你明白为什么UI线程被封锁了我希望?

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

答案 1 :(得分:0)

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

  1. 线程中的代码永远不会结束..你有一个无限循环
  2. 即使您正在创建一个线程,您仍然在UI线程上运行所有内容(使用Invoke)
  3. 这两个组合意味着你基本上无限制地阻止了UI线程。

    基本上,这个:

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

    永远不会结束。并且由于它是在UI线程上调用的,因此只需更新控件的Left坐标,UI就会被无限期阻塞,而不会实际呈现任何内容。