您好我试图使用c#api在Telegram中制作基于文本的游戏。 我有一个数据库,其中包含: 玩家(玩家ID,用户名,健康,金钱,missionID,missionDuration)。
MissionID和missionDuration可以为NULL。
使命(missionID,描述)。
当玩家向机器人发送命令" / mission"时,会向玩家分配随机任务并生成随机持续时间编号。
我如何检查任务是否结束?
我制作了这段代码来检查持续时间是否结束:
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;
}
当然这是错误的,因为总是使用cpu。 有一种方法可以更好地检查时间是否过去了?
答案 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);