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

时间:2017-12-29 10:44:59

标签: c# wpf for-loop mvvm timer

我希望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();
    }

1 个答案:

答案 0 :(得分:0)

只是为了澄清评论:

除非代码中的代码多于你的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);