我有代码:
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
我做错了什么?
答案 0 :(得分:0)
由于您只是检查模数,因此在StopWatch
小于1分钟且每15分钟从那里开始时,每10秒会有一条消息。这是因为零模15为零,因此条件匹配。
如果您想每15分钟只调用一次,则必须将当前值与之前的值进行比较,如果超过15分钟,则发送消息,然后将之前的值设置为当前值。然后继续比较。
这种方式只有在计时器达到15分钟时才会发生一次。还记得在秒表归零时将前一个值归零。
当秒表归零时,您还可以使用计时器取消它。通常系统计时器的资源密集程度较低。