Как заставить таймер продолжать работать, пока цикл ожидает другого результата времени?

у меня есть следующая проблема в моем коде, у меня есть этот цикл, работающий на таймере (это лишь малая часть циклов, которые работают на большом таймере),

внутри этого большого таймера (он тикает каждую 1 секунду) у меня есть 1 метод, которому нужно подождать 5 секунд, а затем продолжить с остальным кодом цикла, но я хочу, чтобы он не застрял в коде, и таймер продолжит работать каждую 1сек и не буду ждать тех 5 секунд.

Что я сделал, я добавил новый таймер (timer_deva), который тикает каждые 5 секунд и выполняет все проверки внутри него, а затем таймер останавливается.

поэтому моя проблема в том, что мне нужно подождать 5 секунд, чтобы получить значение для завершения моего кода, но мне нужно, чтобы мой основной таймер продолжал работать одновременно, и когда он получит свой результат в другое время, ему нужно будет завершить код, который он оставил позади.

заранее спасибо,

else if (mobID.Equals(Convert.ToInt32(txtDeva)))
{
    //START CHECK WITH TIMER
    timer_deva.Start();
    //Methods inside timer_deva update the winnerNation
    //END CHECK TIMER - GET RESULT
    winner(zoneId, winnerNation, humansKills, orcKills);
}
 Dan27217 мая 2013 г., 11:54
Вы имеете в виду создать новый поток для вызова timer_deva?
 Nolonar17 мая 2013 г., 11:58
Я бы несоздать новую тему для такого тривиального вопроса. использованиеЗадачи вместо. Требуется .NET 4 или более поздняя версия. Нити очень дорогие, а задачи довольно дешевые.
 Nolonar17 мая 2013 г., 12:03
Я не очень уверен в моем опыте с Задачами, но, возможно, это то, что вам нужно?Task.Run((args) => myMethod(args)), который позвонитmyMethod(args) в новом задании.
 Dan27217 мая 2013 г., 12:21
Я никогда не работал с задачами раньше, попробую сейчас и посмотрим, как все пойдет. даст обновление в несколько.
 Nolonar17 мая 2013 г., 11:39
Что должно произойти, когда таймер снова тикает, покавсе еще ждет второй таймер? Я полагаю, вы могли бы создать новую задачу наtimer_Tick(), который будет ждать окончания второго таймера. Таким образом, твой таймер победилt остановится, и ваша задача будет запущена в другом потоке и все закончится вместе, когда тикает второй таймер.

Ответы на вопрос(1)

ТЛ; др

Обычные таймеры не используются в играх. У игр совершенно другой механизм обработки своей логики и прошедшего времени.

Длинная версия:

Я знаю, что это не может ответить на ваш вопрос напрямую, но этоS способ много текста, чтобы втиснуть в комментарий. Ваши таймеры звучат очень сложно и иерархично. Из ваших имен переменных я буду предполагать, что вы программируете игру. Игры обычно неработать с таймерами или не так, как вы ожидаете. Это отличное игровое поведение очень поможет вам в вашей проблеме с таймерами и может даже больше помочь вам с вашим дизайном в целом.

Игры обычно имеют что-тоgame loop, Вообще говоря этоs три основные функции, которые вызываются одна за другой в цикле:

while(running)
{
    HandleUserInput();
    ChangeWorld();
    Render();
}

Вы получаете пользовательский ввод, вы соответственно меняете игровой мир и рисуете его на экране. Теперь, чем быстрее ваш компьютер, тем быстрее работает этот цикл. Тот'Хорошо для графики (думаю, FPS), но плохо для игры. Представьте себе тетрис, куда каждый кадр перемещают блоки. Теперь я не хотел бы покупать более быстрый компьютер, игра стала бы более сложной.

Таким образом, чтобы поддерживать постоянную скорость игры независимо от мощности компьютера, цикл учитывает прошедшее время:

while(running)
{
    var timePassedSinceLastLoop = CalculateTimeDelta();

    HandleUserInput();
    ChangeWorld(timePassedSinceLastLoop);
    Render();
}

Теперь представьте время восстановления чего-то в игре. Игрок нажал "а"произошло какое-то крутое действие, и хотя он может нажать «а» опять ничего не произойдет в течение следующих 5 секунд. Но игра по-прежнему работает и делает все остальное, что может случиться в игре. Это не обычный таймер. Это'переменная, давайте назовем этоActionCooldownи как только игрок запускает действие,с 5 секунд. Каждый раз, когда мир меняется, времяPassed вычитается из этого числа дос нуля. Игра все время работает и обрабатывает ввод и рендеринг. Но только один разActionCooldown ударяет ноль, еще одно нажатие "а" снова запустит это действие.

 Artemix17 мая 2013 г., 13:01
Я думаю, что лучше разместить раздел в начале ответа. Я был удивлен, обнаружив его внизу поста.
 Dan27217 мая 2013 г., 16:17
большое спасибо за отличную проницательность, я с радостью приму к сведению, что с другими проектами этот проект действительно работает с игрой, но это не сама игра, это инструмент, который является дополнением к игре, он читает файлы журнала игры. и определите, что делать в соответствии с этим, поэтому в этом случае, если 1 условие истинно для 1 журнала, необходимо проверить другой журнал через 5 секунд, а затем продолжить цикл с результатом из другого журнала, но в то же время цикл должен быть запущен для проверки других файлов журналов и т. д.
 nvoigt17 мая 2013 г., 13:52
Вы правы, я перенес это

Ваш ответ на вопрос