C# 如何实现时间延迟?

C# 如何实现时间延迟?,c#,timer,delay,wait,sleep,C#,Timer,Delay,Wait,Sleep,我现在编程已经3周了,所以我试着制作一个记忆游戏。 除了延迟外,一切正常。我尝试了许多不同的选项,但不知何故,延迟出现在按钮\u单击事件的末尾 如果我单击第一个按钮,它会更改内容,但当我单击第二个按钮时 按钮无论触发哪个语句,第二张卡都不会显示。代码工作正常,直到事件结束,然后发生3秒的延迟 我想实现的是,你可以在短时间内看到第二张牌 在两张牌都翻过来或消失之前 附言-如果我在“延迟”之后添加一个消息框,它似乎会起作用 但这不是我的目标,所以有没有像等待同步或我错过了什么 代码: 让我们简化代码

我现在编程已经3周了,所以我试着制作一个记忆游戏。 除了延迟外,一切正常。我尝试了许多不同的选项,但不知何故,延迟出现在
按钮\u单击事件的末尾

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

我想实现的是,你可以在短时间内看到第二张牌 在两张牌都翻过来或消失之前

附言-如果我在“延迟”之后添加一个
消息框
,它似乎会起作用 但这不是我的目标,所以有没有像等待同步或我错过了什么

代码:


让我们简化代码:

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
}
这样,您就有了以下时间线:

  • 设置内容(但不查看/感受内容)
  • 你开始等3秒钟
  • 你等了3秒钟就结束了
  • 设置内容(但不查看/感受内容)
  • 您可以退出
    按钮,单击
    方法
  • 你实际上看到/感觉到了内容的变化
  • 正如您所看到的,内容更改(在item1和item4)并不是立即发生的,而是在很久以后发生的;这是因为UI线程在执行
    按钮\u Click
    方法时被阻塞,因此无法刷新图形。
    为了实现您的目标,您有两个选择:

    • 使用
      async/await
    • 使用
      调度程序

    使用计时器-在需要时启动和停止它。查找
    任务。延迟
    我建议阅读有关游戏编程的内容。其想法是在游戏中编程一些时钟,它将“一个时间间隔过去”向对象发送消息。然后,对象可以检查内部状态,如果是“时间”,则可以执行某些操作。你可以查一下,也可以查一下。但是,您可以使用简单的等待N毫秒
                    MessageBox.Show("x");
                    new System.Threading.ManualResetEvent(false).WaitOne(3000);
    
    
    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
    }
    
    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
    }
    
    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();
    }