【问题标题】:How do i implement a time delay? [duplicate]我如何实现时间延迟? [复制]
【发布时间】:2020-06-25 13:21:32
【问题描述】:

我现在编程已经 3 周了,所以我尝试构建一个记忆游戏。 一切正常,除了延迟。我尝试了许多不同的选项,但不知何故,延迟出现在 Button_Click 事件的末尾。

如果我单击第一个按钮,它会更改内容,但是当我单击第二个按钮时 按钮无论触发哪个if 语句,第二张卡片都不会显示。代码工作正常,直到事件结束 THEN 3 秒的延迟发生

我想要实现的是你可以在短时间内看到第二张卡片 在两张牌被翻回或消失之前。

附: - 如果我在“延迟”之后添加MessageBox 似乎有效 但这不是目标,所以是否有诸如等待同步之类的东西或我错过的东西?

代码:

private void Button_Click(object sender, RoutedEventArgs e)
        {
            var button = (Button)sender;
            int index = ContainderGrid.Children.IndexOf(button);

            mCounterSecondPic++;

            button.Content = new BitmapImage(new Uri(mImgPath[mPairs[index]]));//change content
            mPic[mCounterSecondPic-1] = mPairs[index];
            button.IsEnabled = false;

            if (mPic[0] == mPic[1] & mCounterSecondPic == 2)
            {

                mCounterSecondPic = 0;

                new System.Threading.ManualResetEvent(false).WaitOne(3000); //wait for 3sec

                ContainderGrid.Children.RemoveAt(mPairs.IndexOf(mPic[0]));
                 mPairs.RemoveAt(mPairs.IndexOf(mPic[0]));
                 ContainderGrid.Children.RemoveAt(mPairs.IndexOf(mPic[0]));
                 mPairs.RemoveAt(mPairs.IndexOf(mPic[0]));

            }

            if (mCounterSecondPic == 2 & mPic[0] != mPic[1])
            {

                mCounterSecondPic = 0;

                new System.Threading.ManualResetEvent(false).WaitOne(3000);//wait for3 sec

                ContainderGrid.Children.Cast<Button>().ToList().ForEach(resetbuttons =>
                {
                    resetbuttons.IsEnabled = true;
                    resetbuttons.Content = new BitmapImage(new Uri(mCardBack));

                });


            }

ps:如果我在“延迟”之前添加一个消息框,它似乎可以工作 但这不是 gole,所以有什么类似等待同步或我错过的东西吗?

                MessageBox.Show("x");
                new System.Threading.ManualResetEvent(false).WaitOne(3000);

【问题讨论】:

  • 使用计时器 - 需要时启动和停止。
  • 我想建议阅读有关游戏编程的内容。这个想法是在游戏中编写一些时钟,它将向“经过一个时间间隔”的对象发送消息。然后对象可以检查内部状态并在“时间”时执行某些操作。您可以查看quartz.netReactive。您可以使用Thread.Sleep 来简单地等待 N 毫秒

标签: c# timer delay wait sleep


【解决方案1】:

让我们简化一下代码:

private void Button_Click(object sender, RoutedEventArgs e)
{
    button.Content = "START" //change content
    new System.Threading.ManualResetEvent(false).WaitOne(3000); //wait for 3sec
    button.Content = "FINISH" //change content
}

这样你就有了以下时间线:

  1. 设置内容(但不要看到/感受它)
  2. 你开始等待 3 秒
  3. 等待 3 秒结束
  4. 设置内容(但不要看到/感受它)
  5. 退出 Button_Click 方法
  6. 您实际上看到/感觉到内容变化

如您所见,内容更改(在 item1 和 item4 处)并没有立即发生,而是在很久以后发生的;这是因为 UI 线程在 Button_Click 方法的执行过程中被阻塞,因此无法刷新图形。
为了实现你想要的,你有两种选择:

  • 使用async/await:
private async void Button_Click(object sender, RoutedEventArgs e)
{
    button.Content = "START" //change content
    await Task.Delay(3000); //wait for 3sec asynchronously
    button.Content = "FINISH" //change content
}
  • 使用Dispatcher:
private void Button_Click(object sender, RoutedEventArgs e)
{
    new Thread(() =>
    {
        Dispatcher.Invoke(() => button.Content = "START");
        System.Threading.Thread.Sleep(3000);
        Dispatcher.Invoke(() => button.Content = "FINISH");
    }).Start();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-24
    • 2010-09-09
    • 1970-01-01
    • 2019-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多