如何让程序等待X秒并允许UI执行?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何让程序等待X秒并允许UI执行?相关的知识,希望对你有一定的参考价值。

我正在制作一个具有自动播放功能的小游戏,但程序运行得太快,因此用户无法在每个阶段看到结果。我使用VS 2017,所以我不能使用异步(至少从我读过的内容)。如何让程序等待并允许UI更新?

我正在做一个while循环。游戏的主要部分执行,更新UI,然后等待玩家点击按钮(假设自动播放未运行),自动播放运行do while循环重复,但在UI更新后它将等待X秒。

答案

看起来你有几个选择

你可以尝试睡眠 - (但它可能会挂起UI)

 int Seconds = 1;
 Threading.Thread.Sleep(Seconds * 1000);

你可以试试这段代码:

int Seconds = 1;
Private void WaitNSeconds(int seconds)
    { 
       if (seconds < 1) return;
         DateTime _desired = DateTime.Now.AddSeconds(seconds);
         while (DateTime.Now < _desired) {
              System.Windows.Forms.Application.DoEvents();
         }
     }

3.尝试使用Async,看看会发生什么

async Task MakeDelay() {
      await Task.Delay(5000); 
}   
private async void btnTaskDelay_Click(object sender, EventArgs e) {
      await MakeDelay();          
}
另一答案

使用Timer组件而不是循环,并将循环体放在计时器的Elapsed事件中。

VS2017绝对支持async,但在这种情况下它无济于事......对于用户而言,事情仍然会变得太快。

另一答案

您可以使用async / await来减慢事件处理程序的执行速度,而无需拆分逻辑。这很简单:

async void Button_Click(object sender, RoutedEventArgs e) // wpf event handler
{
    ...
    await Task.Delay(1000); // pause 1 second
    ...

    while (someCondition)
    {
        ...
        await Task.Delay(1000);
        ...
    }
}

你可以在async上阅读关于await / msdn的内容。

如果您使用的是WPF,那么您必须查看animations。与手动更改某些内容(位置,大小)相比,它们更易于使用以确保顺利更改。

另一答案

用法:DelayFactory.DelayAction(500,new Action(()=> {this.RunAction();}));`

//注意Forms.Timer和Timer()有类似的实现。 //假设您将拥有一个DelayFactory静态类

public static void DelayAction(int millisecond, Action action)
{
    var timer = new DispatcherTimer();
    timer.Tick += delegate

    {
        action.Invoke();
        timer.Stop();
    };

    timer.Interval = TimeSpan.FromMilliseconds(millisecond);
    timer.Start();
}

以上是关于如何让程序等待X秒并允许UI执行?的主要内容,如果未能解决你的问题,请参考以下文章

Sleep() 方法后的代码片段没有被执行

UI5 - XML 片段中的格式化程序只执行一次。如何再次运行它们?

UI5 - XML片段中的格式化程序只执行一次。如何再次运行它们?

如何从 Android 中的 Fragment 访问 UI 元素?

如何让R执行暂停,休眠,等待X秒?

我该如何做模态对话框片段(代码在我关闭之前不会执行)