如何在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仍在Stop()之后勾选事件并设置为null