B5891 Ответов: 1

Как дождаться, пока таймер закончит работу, чтобы продолжить цикл? В MVVM С#


я попробовал несколько вещей, но они не увенчались успехом. Может ли кто-нибудь помочь мне, пожалуйста?

Я хочу использовать цикл for, цикл for должен вызвать таймер диспетчера, но должен ждать, пока таймер не закончит работу, чтобы продолжить цикл. Заранее спасибо!

Что я уже пробовал:

частная асинхронного LoopHead недействительным(объект отправителя, EventArgs в электронной)
{
HomeM.SystemInfo = "Bezig met loopen...";
int number = DOORLOOPTEST.Свойства.Настройки.По умолчанию.Петли * 2;
sbyte HeadUpTime = конвертировать.Тосбайт (((DOORLOOPTEST.Свойства.Настройки.По умолчанию.TimeHead_UP).ToString()).Remove(0, 6));
sbyte HeadDownTime = конвертировать.Тосбайт (((DOORLOOPTEST.Свойства.Настройки.По умолчанию.TimeHead_DOWN).ToString()).Remove(0, 6));
ДОРЛУПТЕСТ.Свойства.Настройки.По умолчанию.LOOPS_DONE = 0;
ДОРЛУПТЕСТ.Свойства.Настройки.По умолчанию.Сохранить();
ДОРЛУПТЕСТ.Свойства.Настройки.По умолчанию.LOOPS_TODO = DOORLOOPTEST.Свойства.Настройки.По умолчанию.ПЕТЛИ;
ДОРЛУПТЕСТ.Свойства.Настройки.По умолчанию.Сохранить();


for (int i = 0; i < DOORLOOPTEST.Свойства.Настройки.По умолчанию.Циклы; i++)
{
строковое значение = DOORLOOPTEST.Свойства.Настройки.По умолчанию.UP_or_DOWN;
переключатель (значение)
{
дело "вверх":
_time = TimeSpan.FromSeconds(HeadUpTime);
HomeM.PIN_ON = DOORLOOPTEST.Свойства.Настройки.По умолчанию.PMHU_ON;
HomeM.PIN_OFF = DOORLOOPTEST.Свойства.Настройки.По умолчанию.PMHU_OFF;
_MotorMove = новая задача(() => MotorMove(sender, e, _time));

_MotorMove.Wait((HeadUpTime + 3) * 1000);
ДОРЛУПТЕСТ.Свойства.Настройки.По умолчанию.UP_or_DOWN = "вниз";
ДОРЛУПТЕСТ.Свойства.Настройки.По умолчанию.Сохранить();
перерыв;

дело "вниз":
_time = TimeSpan.FromSeconds(HeadDownTime);
HomeM.PIN_ON = DOORLOOPTEST.Свойства.Настройки.По умолчанию.PMHD_ON;
HomeM.PIN_OFF = DOORLOOPTEST.Свойства.Настройки.По умолчанию.PMHD_OFF;
_MotorMove = новая задача(() => MotorMove(sender, e, _time));

_MotorMove.Wait((HeadUpTime + 3) * 1000);
ДОРЛУПТЕСТ.Свойства.Настройки.По умолчанию.UP_or_DOWN = "вверх";
ДОРЛУПТЕСТ.Свойства.Настройки.По умолчанию.Сохранить();
ДОРЛУПТЕСТ.Свойства.Настройки.По умолчанию.LOOPS_DONE += 1;
ДОРЛУПТЕСТ.Свойства.Настройки.По умолчанию.Сохранить();
ДОРЛУПТЕСТ.Свойства.Настройки.По умолчанию.LOOPS_TODO = DOORLOOPTEST.Свойства.Настройки.По умолчанию.Петли -= 1;
ДОРЛУПТЕСТ.Свойства.Настройки.По умолчанию.Сохранить();
Севера.LoopsDone = DOORLOOPTEST.Свойства.Настройки.По умолчанию.LOOPS_DONE.Метод toString();
Севера.LoopsToDo = DOORLOOPTEST.Свойства.Настройки.По умолчанию.LOOPS_TODO.Метод toString();
перерыв;
}
}
}

private void MotorMove(object sender, EventArgs e, TimeSpan _time)
{
TimerBegint(отправитель, e);
LOOP_timer = новый DispatcherTimer(Нью-значение типа TimeSpan(0, 0, 1), DispatcherPriority.Нормально, делегат
{
если (_time == промежутка времени.Ноль)
{
LOOP_timer.Стоп();
LOOP_timer.ТИК += TimerIsGedaan;
}
_time = _time.Добавить(TimeSpan.FromSeconds(-1));
}, Приложение.Текущий.Диспетчер);

LOOP_timer.Начать();
}

1 Ответов

Рейтинг:
2

PureNsanity

На самом деле вы не запускаете задачу _MotorMove. Используйте Task.Run вместо новой задачи; однако ожидание тоже не работает так, как вы ожидаете. Wait выдаст исключение, если задача не будет завершена в течение этого времени, но она будет продолжена, как только она завершится.

Я бы использовал здесь задачи продолжения и поставил задачу.Задержка в конце для любой необходимой задержки. Кроме того, вы можете использовать ManualResetEvent или монитор для более детального управления.