C# Winforms窗口冻结
WinC窗体# 我在我的snake游戏中实现了一个加电系统,每次我运行这个方法来产生一个加电,窗口就会完全停止,好像它在处理一些很重但永远不会发生的事情。我没有收到任何错误或窗口要求关闭窗口 这是我的剧本: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) {
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]==背景颜色)
在某个点上满足条件,则会出现这种情况。您还错误地使用了随机
。