如何延迟循环周期?

Posted

技术标签:

【中文标题】如何延迟循环周期?【英文标题】:How to delay for loop cycles? 【发布时间】:2014-09-02 13:55:39 【问题描述】:

我有一个 for 循环,我在其中计算某些东西的值并显示它,例如

void Button_Click(object sender, RoutedEventArgs e)

    InitializeComponent();

    Random rand = new Random();
    for (i = 0; i <= 30; i++)        
    
       rnd = rand.Next(1,10);
       value += i + rnd;
       display.Content = value;
    

问题是,我想看到每个周期后被覆盖的值,延迟 X 秒,我怎么能在 WPF 中实现呢?

【问题讨论】:

看看DispatcherTimer类。 只是延迟?在线程池调用(或任务)中休眠,然后分派到主线程进行更新。重复?调度的计时器。 我试过 Thread.Sleep(),但它会停止整个线程,然后完成整个循环。 Task.Delay() 效果很好,谢谢 【参考方案1】:

使用Task.Delay在一段时间后执行一些代码。

private async void Button_Click(object sender, RoutedEventArgs e)

    InitializeComponent();

    Random rand = new Random();
    for (i = 0; i <= 30; i++)        
    
       rnd = rand.Next(1,10);
       value += i + rnd;
       display.Content = value;
       await Task.Delay(Timespan.FromSeconds(1));
    

【讨论】:

我有一个关于从 async 方法返回 void 的警告标志。 @Jodrell,这是 async void (异步事件处理程序)的预期用例,但是是的,OP 最终从该事件中分离出返回 Task 的异步方法是个好主意处理程序。在 OP 学习期间,这仍然是一个很好的简单解决方案。 @Jodrell 这是事件的事件处理程序。这种确切的情况实际上正是他们首先使 async void 合法的原因。 经过研究我同意***.com/questions/19415646/… @Servy,正如对 Jodrell 链接的问题的回答中所述,主要好处是将逻辑与事件处理程序隔离开来(如果最终转移到 MVVM 模式,则很可能在视图模型中),它允许进行单元测试。 Task 实例还可用于在稍后有意义的特定时间点显式处理异常。目前对 OP 的担忧并不紧迫,但值得在未来考虑。

以上是关于如何延迟循环周期?的主要内容,如果未能解决你的问题,请参考以下文章

如何避免双向绑定的摘要周期延迟

Verilog中想要让某个项延迟几个时钟周期,最好的办法是啥

延迟初始化和保留周期

消息队列-一篇读懂rabbitmq(生命周期,confirm模式,延迟队列,集群)

(转载)Actor 生命周期

如何减少因子循环的执行时间和周期数?和/或代码大小?