我如何实现时间延迟? [重复]

问题描述 投票:0回答:1
我现在编程尚需3周时间,所以我尝试构建一个记忆游戏。一切正常,除了延迟。我尝试了许多不同的选项,但是以某种方式延迟了Button_Click事件的结束。

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

我想实现的是,您可以在短时间内看到第二张卡在两张卡都被转回或消失之前。

P.S。 -如果我在[延迟]之后加上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:如果我在“延迟”之前添加一个messageBox,它似乎可以工作但这不是gole,所以是否有诸如等待同步之类的东西或我错过的东西?

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

c# timer delay wait sleep
1个回答
0
投票
让我们简化代码:

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. 您实际上
  7. 看到/感觉
  8. 内容更改
您可以看到内容更改(在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(); }
  • © www.soinside.com 2019 - 2024. All rights reserved.