C#中的StopWatch计算不活动时间

时间:2017-07-21 17:59:14

标签: c# time timespan stopwatch

我有代码:

 public static Stopwatch stopWatch = new Stopwatch();

    private void start_Checker()
    {
        stopWatch.Start();
        while (true)
        {
            TimeSpan ts = stopWatch.Elapsed;
            if (ts.Minutes % 15 == 0)
            {
                Core.sendLog("Detected " + ts.Minutes + " of possible inactivity. Bot might be in game. Waiting " + (Core.inactivity_Max - ts.Minutes) + " minutes before restarting", false);
            }
            if (ts.Minutes >= Core.inactivity_Max)
            {
                Core.sendLog(Core.inactivity_Max + " minutes of inactivity - restarting the bot.");
                Thread.Sleep(500);
                Process.Start(Assembly.GetExecutingAssembly().Location);
                Environment.Exit(0);
            }
            Thread.Sleep(10000);
        }
    }

和Core类中的这个:

   public static void sendLog(string text, bool isAction = true)
    {
        if (isAction)
        {
            Listener.stopWatch.Reset();
        }
        using (WebClient client = new WebClient())
        {
            try
            {
                string log = "[" + account[0] + "] " + text + " | Time: " + DateTime.Now;
                client.OpenRead(url + @"elements/logs/logs.php?file=" + used_email + "&text=" + log);
            }
            catch (Exception)
            {
                return;
            }
        }
    }

应该每隔15分钟发送一次日志,如果ts.Minutes超过最大不活动时间 - 它应该重置应用程序。 每次执行sendLog()时,都会重置秒表的时间。

当前代码导致日志文件被垃圾邮件发送,如下所示:

[ChristianFromDK] Detected0 of possible inactivity. Bot might be in game. Waiting 80 minutes before restarting | Time: 7/21/2017 7:50:18 PM

我做错了什么?

1 个答案:

答案 0 :(得分:0)

由于您只是检查模数,因此在StopWatch小于1分钟且每15分钟从那里开始时,每10秒会有一条消息。这是因为零模15为零,因此条件匹配。

如果您想每15分钟只调用一次,则必须将当前值与之前的值进行比较,如果超过15分钟,则发送消息,然后将之前的值设置为当前值。然后继续比较。

这种方式只有在计时器达到15分钟时才会发生一次。还记得在秒表归零时将前一个值归零。

当秒表归零时,您还可以使用计时器取消它。通常系统计时器的资源密集程度较低。