如何在DispatcherTimer结束之前暂停for循环?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在DispatcherTimer结束之前暂停for循环?相关的知识,希望对你有一定的参考价值。

我希望for循环等到计时器结束,然后继续for循环。我该怎么做呢?我试着等待和异步,我做错了什么。它现在做什么:循环启动,运行计时器但不等待它完成。所以它循环开启,并再次启动计时器。

更多关于我的项目:它是一个电动床的电机测试仪。这段代码需要在电机上升或下降的时间运行。因此我使用MVVM,WPF,ADRUINO UNO。

如果有人有好的建议,我很乐意听到。 (对不起,我的英语不好)。

代码:

private async void Loop(object sender, EventArgs e)
    {
        for (int i = 0; i < DOORLOOPTEST.Properties.Settings.Default.LOOPS; i++)
        {
            string value = DOORLOOPTEST.Properties.Settings.Default.UP_or_DOWN;
            switch (value)
            {
                case "UP":
                    _time = TimeSpan.FromSeconds(HeadUpTime);
                    _MotorMove = new Task(() => MotorMove(sender, e, _time));
                    await _MotorMove;
                    break;

                case "DOWN":
                    _time = TimeSpan.FromSeconds(HeadDownTime);
                    _MotorMove = new Task(() => MotorMove(sender, e, _time));
                    await _MotorMove;
                    break;
            }
        }
    }

    private void MotorMove(object sender, EventArgs e, TimeSpan _time)
    {
        TimerBegins(sender, e);
        LOOP_timer = new DispatcherTimer(new TimeSpan(0, 0, 1), DispatcherPriority.Normal, delegate
        {
            if (_time == TimeSpan.Zero)
            {
                LOOP_timer.Stop();
                LOOP_timer.Tick += TimerIsGedaan;
            }
            _time = _time.Add(TimeSpan.FromSeconds(-1));
        }, Application.Current.Dispatcher);

        LOOP_timer.Start();
    }
答案

只是为了澄清评论:

除非代码比你的MVCE还多,看起来DispatcherTimer的唯一目的是引入TimeSpan _time的延迟,在1秒的量子中勾选,然后最后的滴答然后停止计时器,订阅TimerIsGedaan,然后启动再次计时?

假设你想要做的只是在TimerIsGedaan过去后调用TimeSpan _time,那么如何将MotorMove转换为异步,并使用Task.Delay

private async Task MotorMove(object sender, EventArgs e, TimeSpan _time)
{
    TimerBegins(sender, e);
    await Task.Delay(_time);
    TimerIsGedaan();
}

除非你每次都需要一个新的线程,你也可以考虑从你的Task.Run代码中删除Loop,即

 await MotorMove(sender, e, _time);

以上是关于如何在DispatcherTimer结束之前暂停for循环?的主要内容,如果未能解决你的问题,请参考以下文章

WPF 如何知道当前有多少个 DispatcherTimer 在运行

dotnet 读 WPF 源代码 聊聊 DispatcherTimer 的实现

如何重置DispatcherTimer?

DispatcherTimer仍在Stop()之后勾选事件并设置为null

播放和暂停按钮正在工作...但是如何重置按钮以在音频结束后显示播放符号?

c# 之下如何做定时