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

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

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

考虑到这一点,你的代码正在启动一个新线程,然后在这个线程中告诉UI线程去运行一堆永远运行的代码。

现在你知道为什么UI线程被阻塞了吗?

你需要在后台线程中有你的主while循环(即不在Invoke调用内部),并限制Invoke调用,特别是更新UI的小块代码

嗯,你的方法有几个问题:

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

这两个组合意味着你本质上是无限阻塞UI线程。

从本质上讲,这样的:

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

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