Winforms窗口冻结

时间:2018-12-16 16:10:29

标签: c# winforms freeze

Winforms C#

我正在蛇游戏中实现加电系统,每当我运行生成加电窗口的方法时,窗口就会完全停止,就好像它正在处理沉重却永远的事情一样。我没有任何错误,也没有窗口要求关闭窗口。

这是我的脚本:

        private void spawn_powerup()
    {
        int r = random.Next(0, Powers.Length);
        foreach (Power_Up item in Powers)
        {
            if (item.code == r)
            {
                bool done = false;
                do
                {
                    int X = random.Next(0, grid_size);
                    int Y = random.Next(0, grid_size);
                    if (matriz[X, Y] == background_color)
                    {
                        matriz[X, Y] = item.Pixel_color;
                        done = true;
                        item.placed = true;
                    }
                } while (done);
                return;
            }
        }
    }

3 个答案:

答案 0 :(得分:1)

您永远不会在done内将false设置为do-while-loop

因此,如果在第一次迭代中,if表达式的值为truedone被设置为true,而您的do-while将永远运行

对于我认为要实现的目标,请将do-while条件更改为!done,但随后必须确保一段时间后满足if条件(但在蛇游戏,这应该不是什么大问题。

答案 1 :(得分:0)

首先,您的逻辑错误。设置为true时,while循环继续,并在发出falsebreak;命令时退出。

您还正在使用同步编程模式。因此,您的应用程序在单线程上运行,每当您调用长时间运行的函数时,您的应用程序就会开始等待该长时间运行的函数完成。然后恢复继续。

请考虑查看Asynchronous Programming in C# 另一个Reference

答案 2 :(得分:0)

由于您写了while(done),因此循环条件将永远不会停止,这意味着:“ while done被设置为true”,它始终如此。 您应该将循环更改为此:

bool done = false;
do
{
    (- your code here -)
} while (!done);