C#-应用程序突然冻结
我实际上在做一个游戏,问题是当一张牌移动时(我使用定时器),它会让我冻结整个表单,有时它会设法加载,有时它会冻结整个游戏。(+阻止单击标签和消息框) 问题:(.png) 代码:(计时器) 卡生成代码C#-应用程序突然冻结,c#,winforms,C#,Winforms,我实际上在做一个游戏,问题是当一张牌移动时(我使用定时器),它会让我冻结整个表单,有时它会设法加载,有时它会冻结整个游戏。(+阻止单击标签和消息框) 问题:(.png) 代码:(计时器) 卡生成代码 #region Adversaire 6 int CarteAleaA6 = CarteAleatoire(); Cartes carteA6 = jeu[CarteAleaA6]; CartesUtilisees.Add(CarteAleaA6); int CarteAleaA6_2 = Car
#region Adversaire 6
int CarteAleaA6 = CarteAleatoire();
Cartes carteA6 = jeu[CarteAleaA6];
CartesUtilisees.Add(CarteAleaA6);
int CarteAleaA6_2 = CarteAleatoire();
while (CartesUtilisees.Contains(CarteAleaA6_2))
{
CarteAleaA6_2 = CarteAleatoire();
}
CarteAleaA6_2 = 1 * CarteAleaA6_2;
ListeCartes.Add(carteA6);
if (Distrib && dist6_1)
{
if (SecondDistr == false)
{
pictureBoxAdv6_1.ImageLocation = carteA6.Image;
}
else
{
Cartes carteA6_2 = jeu[CarteAleaA6_2];
CartesUtilisees.Add(CarteAleaA6_2);
ListeCartes.Add(carteA6_2);
pictureBoxAdv6_2.ImageLocation = carteA6_2.Image;
}
}
#endregion
正如其他人所建议的,也许可以尝试将它们转移到asnyc函数中,并等待它们
public async void moveCardsAdv6_2_Tick(object sender, EventArgs e)
{
await moveCardsAdv6_2_TickAsync();
}
private async Task moveCardsAdv6_2_TickAsync()
{
if (Partie)
{
Distrib = true;
int y6_2 = 48;
int x6_2 = 13;
pictureBoxd6_2.Top += y6_2;
pictureBoxd6_2.Left += x6_2;
#region Adversaire 6
if (pictureBoxd6_2.Top >= 560 && pictureBoxd6_2.Left >= 110)
{
dist6_1 = true;
SecondDistr = true;
moveCardsAdv6_2.Stop();
pictureBoxd6_2.Location = pictureBoxDeck.Location;
GenCartesAdv();
dist6_1 = false;
SecondDistr = false;
moveCardsAdv7_2.Enabled = true;
moveCardsAdv7_2.Start();
}
#endregion
}
}
仅供参考,将
Enabled
属性设置为true
与调用Timer
类的Start()
方法相同。你不需要两者都做。我总是在工作线程上运行我的tick。有助于使事情顺利进行,工作线程也很容易实现。根本原因可能正是@EllieK所想的——可能是您在主UI线程上做了太多工作,导致UI没有响应。您可以查看和以找到实现这一点的方法。
public async void moveCardsAdv6_2_Tick(object sender, EventArgs e)
{
await moveCardsAdv6_2_TickAsync();
}
private async Task moveCardsAdv6_2_TickAsync()
{
if (Partie)
{
Distrib = true;
int y6_2 = 48;
int x6_2 = 13;
pictureBoxd6_2.Top += y6_2;
pictureBoxd6_2.Left += x6_2;
#region Adversaire 6
if (pictureBoxd6_2.Top >= 560 && pictureBoxd6_2.Left >= 110)
{
dist6_1 = true;
SecondDistr = true;
moveCardsAdv6_2.Stop();
pictureBoxd6_2.Location = pictureBoxDeck.Location;
GenCartesAdv();
dist6_1 = false;
SecondDistr = false;
moveCardsAdv7_2.Enabled = true;
moveCardsAdv7_2.Start();
}
#endregion
}
}