2016-12-21 5 views
-2

Привет, я пытаюсь сделать текстовую игру в Telegram с помощью C# api. У меня есть база данных, которая содержит: Player (playerID, имя пользователя, здоровье, деньги, missionID, missionDuration).Задания системы со временем в текстовой игре с помощью телеграммы

MissionID и missionDuration могут быть NULL.

Миссия (missionID, описание).

Когда игрок отправляет боту команду «/ миссия», произвольная миссия назначается игроку и генерируется случайный номер продолжительности.

Как проверить, завершена ли миссия?

Я сделал этот кусок кода, который проверяет, если продолжительность составляет более:

public static bool Check(double duration) 
    { 
     DateTime now = DateTime.Now; 
     DateTime end = DateTime.Now; 

     end = end.AddSeconds(duration); 

     while (now < end) 
     { 
      now = DateTime.Now; 
     } 

     return true; 
    } 

Конечно, это неправильно, потому что процессор всегда используется. Есть ли способ лучше проверить, прошло ли время?

+0

Является ли это Windows Forms заявление? Консольное приложение? WPF? Кажется, что вы ищете таймер, но это зависит от того, какое приложение вы пишете. –

+0

Это консольное приложение. –

ответ

0

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

using System.Threading; 
static private Timer questTimer; 
static private ManualResetEvent questExpired = new ManualResetEvent(false); 

// in your code where you start the quest 

// clears the event to show that the quest has not ended 
questExpired.Reset(); 

// start the timer. 
questTimer = new Timer(QuestEndedCallback, null, TimeSpan.FromSeconds(duration), TimeSpan.FromMilliseconds(-1)); 

Это создает таймер, который начинается немедленно. После duration миллисекунд таймер истечет и вызовет метод QuestEndedCallback. TimeSpan.FromMilliseconds(-1) означает, что это таймер «один выстрел»: он будет указывать один раз, а затем выйти.

QuestEndedCallback является:

static void QuestEndedCallback(object state) 
{ 
    // Set the timer to indicate that the quest has ended. 
    questExpired.Set(); 
} 

В коде, который делает обработку, когда вы хотите, чтобы увидеть, если квесты закончились, вы проверяете событие:

bool questHasEnded = questExpired.WaitOne(0); 

 Смежные вопросы

  • Нет связанных вопросов^_^