Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Winforms窗口冻结_C#_Winforms_Freeze - Fatal编程技术网

C# Winforms窗口冻结

C# Winforms窗口冻结,c#,winforms,freeze,C#,Winforms,Freeze,WinC窗体# 我在我的snake游戏中实现了一个加电系统,每次我运行这个方法来产生一个加电,窗口就会完全停止,好像它在处理一些很重但永远不会发生的事情。我没有收到任何错误或窗口要求关闭窗口 这是我的剧本: private void spawn_powerup() { int r = random.Next(0, Powers.Length); foreach (Power_Up item in Powers) {

WinC窗体#

我在我的snake游戏中实现了一个加电系统,每次我运行这个方法来产生一个加电,窗口就会完全停止,好像它在处理一些很重但永远不会发生的事情。我没有收到任何错误或窗口要求关闭窗口

这是我的剧本:

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

首先,你的while逻辑是错误的。While循环在设置为
true
时继续,在获得
false
中断时退出命令

您还使用了同步编程模式。所以,应用程序在单线程上运行,无论何时调用长时间运行的函数,应用程序都会开始等待长时间运行的函数完成。然后继续

请考虑看一下。
另一个在
do while循环中,您从未将
done
设置为
false

因此,如果在第一次迭代中,if表达式的计算结果为
true
done
将设置为
true
,而
do while
将永远运行


对于我认为您想要实现的目标,请将您的
while
条件更改为
!完成
,但是你必须确保你的
条件在一段时间后得到满足(但在蛇游戏中这应该不是什么大问题)。

你的循环条件永远不会允许它停止,因为你写了
while(done)
,这意味着:“while done设置为true”,它总是这样。 您应该将循环更改为:

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

您从未在循环内将
done
设置为
false
,而(done)
很可能是冻结的原因。@UnholySheep为什么?假设离开(当矩阵[X,Y]==背景色时),您也可以替换
done=true
中断,使用
时(true)
并去掉
booldone=false。如果(矩阵[X,Y]==背景颜色)
在某个点上满足条件,则会出现这种情况。您还错误地使用了
随机