C#-应用程序突然冻结

C#-应用程序突然冻结,c#,winforms,C#,Winforms,我实际上在做一个游戏,问题是当一张牌移动时(我使用定时器),它会让我冻结整个表单,有时它会设法加载,有时它会冻结整个游戏。(+阻止单击标签和消息框) 问题:(.png) 代码:(计时器) 卡生成代码 #region Adversaire 6 int CarteAleaA6 = CarteAleatoire(); Cartes carteA6 = jeu[CarteAleaA6]; CartesUtilisees.Add(CarteAleaA6); int CarteAleaA6_2 = Car

我实际上在做一个游戏,问题是当一张牌移动时(我使用定时器),它会让我冻结整个表单,有时它会设法加载,有时它会冻结整个游戏。(+阻止单击标签和消息框)

问题:(.png)

代码:(计时器)

卡生成代码

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