Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.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
如何使主窗体暂停执行1秒,然后在c#中继续执行?_C#_Winforms - Fatal编程技术网

如何使主窗体暂停执行1秒,然后在c#中继续执行?

如何使主窗体暂停执行1秒,然后在c#中继续执行?,c#,winforms,C#,Winforms,我正在创建一个纸牌游戏,我需要一个方法执行暂停,而一张牌正在屏幕上动画。目前我有这个,它动画卡罚款,但将继续玩游戏,而卡是动画。我不知道该怎么办。我尝试了Thread.Sleep(),但它仍然继续执行所有可能的操作,然后暂停 private void btnPlay_Click(object sender, EventArgs e) { try { string input = Microsoft.V

我正在创建一个纸牌游戏,我需要一个方法执行暂停,而一张牌正在屏幕上动画。目前我有这个,它动画卡罚款,但将继续玩游戏,而卡是动画。我不知道该怎么办。我尝试了Thread.Sleep(),但它仍然继续执行所有可能的操作,然后暂停

private void btnPlay_Click(object sender, EventArgs e)
        {
            try
            {
                string input = Microsoft.VisualBasic.Interaction.InputBox("Please enter your betting amount (£3.00 minimum bet)", "Play", "3.00", -1, -1);
                bet = double.Parse(input);
                if (Globals.Balance > bet)
                {
                    btnHit.Enabled = true;
                    btnStick.Enabled = true;
                    Globals.Balance -= bet;
                    lblBalance.Text = Globals.Balance.ToString();
                    Play();
                }
                else
                {
                    throw new Exception("You don't have enough money!");
                }

            }
            catch (FormatException)
            {
                MessageBox.Show("Incorrect format for betting amount");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

private void Play()
        {
            ClearDetails();
            DealPlayerCard();
            Classes.Deck.NextCard(Deck);
            DealPlayerCard();
            UpdatePlayerTotal();
        }

    private void DealPlayerCard()
            {
                //does stuff here

                switch (cardNum)
                {
                    case 3:
                        pb.Location = new Point(120, 0);
                        timerCard.Enabled = true;
                        timerCard_Tick(null, null);
                        break;
                    case 4:
                        pb.Location = new Point(180, 0);
                        timerCard.Enabled = true;
                        timerCard_Tick(null, null);
                        break;
                    case 5:
                        pb.Location = new Point(240, 0);
                        timerCard.Enabled = true;
                        timerCard_Tick(null, null);
                        break;
                }
                AddPlayerCard(pb);
                AddToHand("Player");
            }

    private void timerCard_Tick(object sender, EventArgs e)
            {
                this.SuspendLayout();
                //sets x and y in a switch statement here

                if ((CardBack.Location.X == x) && (CardBack.Location.Y == y))
                {
                    timerCard.Enabled = false;
                    CardBack.Visible = false;
                    CardBack.Location = new Point(775, 247);
                    this.ResumeLayout();
                }
                else if ((CardBack.Location.X > 417) && (CardBack.Location.Y < 434))
                {
                    CardBack.Location = new Point(CardBack.Location.X - 1, CardBack.Location.Y + 1);
                    timerCard_Tick(null, null);
                }
                else if ((CardBack.Location.X > 417) && (CardBack.Location.Y == 434))
                {
                    CardBack.Location = new Point(CardBack.Location.X - 1, CardBack.Location.Y);
                    timerCard_Tick(null, null);
                }
                else if ((CardBack.Location.X == 417) && (CardBack.Location.Y < 434))
                {
                    CardBack.Location = new Point(CardBack.Location.X, CardBack.Location.Y + 1);
                    timerCard_Tick(null, null);
                }
            }
private void btnPlay\u单击(对象发送方,事件参数e)
{
尝试
{
string input=Microsoft.VisualBasic.Interaction.InputBox(“请输入您的下注金额(最低下注3英镑)”、“玩”、“3.00”、-1、-1);
bet=double.Parse(输入);
如果(Globals.Balance>bet)
{
btnHit.Enabled=true;
btnStick.Enabled=true;
全球。余额-=赌注;
lblBalance.Text=Globals.Balance.ToString();
Play();
}
其他的
{
抛出新的异常(“你没有足够的钱!”);
}
}
捕获(格式化异常)
{
MessageBox.Show(“下注金额格式不正确”);
}
捕获(例外情况除外)
{
MessageBox.Show(例如Message);
}
}
私人虚空游戏()
{
ClearDetails();
DealPlayerCard();
类别.甲板.下一卡(甲板);
DealPlayerCard();
UpdatePlayerTotal();
}
私有void DealPlayerCard()
{
//这里有东西吗
开关(cardNum)
{
案例3:
pb.位置=新点(120,0);
timerCard.Enabled=true;
timerCard_Tick(空,空);
打破
案例4:
pb.位置=新点(180,0);
timerCard.Enabled=true;
timerCard_Tick(空,空);
打破
案例5:
pb.位置=新点(240,0);
timerCard.Enabled=true;
timerCard_Tick(空,空);
打破
}
AddPlayerCard(pb);
AddToHand(“玩家”);
}
私有void timerCard_Tick(对象发送方、事件参数e)
{
这个.SuspendLayout();
//在此处的switch语句中设置x和y
if((CardBack.Location.X==X)和&(CardBack.Location.Y==Y))
{
timerCard.Enabled=false;
CardBack.Visible=false;
位置=新点(775247);
这是resumeloayout();
}
否则如果((CardBack.Location.X>417)和&(CardBack.Location.Y<434))
{
CardBack.Location=新点(CardBack.Location.X-1,CardBack.Location.Y+1);
timerCard_Tick(空,空);
}
else if((CardBack.Location.X>417)和&(CardBack.Location.Y==434))
{
CardBack.Location=新点(CardBack.Location.X-1,CardBack.Location.Y);
timerCard_Tick(空,空);
}
else if((CardBack.Location.X==417)和&(CardBack.Location.Y<434))
{
CardBack.Location=新点(CardBack.Location.X,CardBack.Location.Y+1);
timerCard_Tick(空,空);
}
}

启用计时器会立即返回,并且计时器事件会单独发生,这就是为什么您会看到游戏继续进行

相反,在动画完成后,将游戏的其余部分移动到计时器事件。像这样(伪代码):


我想您可能有一些示例中没有的游戏循环,您可能还需要暂停。

您是否可以编辑您的帖子以包括调用
DealPlayerCard
的位置?如果它是一个事件处理程序,您可以将其标记为
async void
并使用
wait Task.Delay(1000)我已经编辑过,它也会从btnHit事件处理程序以及btnPlayYou在click处理程序中执行很多不应该执行的操作。不过,我担心建议一个更好的架构实在太宽泛了。也许你应该研究一下如何设计这种类型的游戏。我猜您可能希望某种队列或调度程序在应该发生的时候让事情发生。在根解释中通常是正确的,但是请注意,这不会像预期的那样起作用,因为“continueGame”将在TimerRead的上下文中执行,而不是在主线程中执行。一般来说,最好使用完全不同的方法在屏幕上“呈现”内容。@JorgeCórdoba:在一个致力于正确回答用户问题的网站上纠正错误是不礼貌的,这种想法很奇怪;指出错误没有什么不礼貌的。在这种情况下,以及所有这些情况下,我都对了解人们是如何形成对编程的信念感兴趣,因为这有助于我设计更好的对象模型、更好的文档等等,从而在开始之前防止可能的错误。你能说说为什么你认为windows窗体应用程序可能使用线程计时器吗?@JorgeCórdoba:我还注意到,我从来没有说过你错了;如果你因为某种原因感到尴尬,那不是我的责任。到目前为止,我所做的只是(1)请您解释为什么计时器会回调错误的线程,(2)确认在winforms中使用线程计时器被记录为错误的,(3)指出我没有看到任何证据表明用户正在这样做
private void DealPlayerCard()
{
    //does stuff here
    timer.Enabled = true;
    // no more code
}

private void timerCard_Tick(object sender, EventArgs e)
{
     switch (location)
         case first:
             DoSomeStuff();
         case next:
             DoSomeOtherStuff();
         case finished:
             timer.enabled = false;
             continueGame();
 }