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