当.checked
命令在15分钟内未完成时,我希望计时器每分钟发送一次垃圾邮件。现在,出于测试目的,我将其设置为一些非常快的数量。完成检查后,将调用Check()
。
我试图做这样的事情:
public static void Check()
{
MinecraftClient.ChatBots.DiscordWallTimer.TimerOn = false;
Program.StartTimer();
}
public static System.Timers.Timer EnableTimer;
public static Task StartTimer()
{
EnableTimer = new Timer()
{
Interval = 15 * 1000,
AutoReset = false,
Enabled = true
};
EnableTimer.Elapsed += OnTimerTicked;
return Task.CompletedTask;
}
public static void OnTimerTicked(object sender, ElapsedEventArgs e)
{
MinecraftClient.ChatBots.DiscordWallTimer.TimerOn = true;
MinecraftClient.ChatBots.DiscordWallTimer.StartTimer();
}
并将其放在我的计时器课程中:
public class DiscordWallTimer
{
public static bool TimerOn;
public static System.Timers.Timer wallTimer;
internal static Task StartTimer()
{
Console.WriteLine("Wall timer has started");
wallTimer = new Timer()
{
Interval = 5*1000,
AutoReset = true,
Enabled = TimerOn
};
wallTimer.Elapsed += OnTimerTicked;
return Task.CompletedTask;
}
private static void OnTimerTicked(object sender, ElapsedEventArgs e)
{
if (TimerOn == true)
{
Program.SendAlertDiscord();
}
}
}
唯一的问题是,如果.check最近已完成,警报仍然会发送(我认为为了进行测试,我将其设置为15秒。) 预先感谢!
答案 0 :(得分:1)
我建议使用设计用于执行此类操作的库,而不是浪费计时器的时间-这可能很难。
尝试使用Microsoft的Reactive Framework:
git rev-list --filter=blob:limit=100 | xargs
就是这样。只需拨打一次private static Subject<Unit> _check = new Subject<Unit>();
private static IDisposable _subscription = null;
private static void SetUp()
{
_subscription =
_check
.Select(x => Observable.Timer(TimeSpan.FromMinutes(15.0), TimeSpan.FromMinutes(1.0)))
.Switch()
.Subscribe(x => Program.SendAlertDiscord());
}
public static void Check()
{
_check.OnNext(Unit.Default);
}
,然后每当致电SetUp
时,您就会启动一个15分钟的计时器,然后每分钟发送一次垃圾邮件。对Check()
的任何调用都会自动重置计时器。
如果要关闭代码,请致电Check()
。
只需NuGet“ System.Reactive”即可获取这些位,然后将_subscription.Dispose();
添加到您的代码中。
如果您有任何线程问题,请让我知道,我将帮助您将代码整理为适合您的线程。
答案 1 :(得分:0)
实际上,您无需停止计时器DiscordWallTimer,您只需进行一些修改即可,一切都OK, 您不需要变量TimerOn
public static void Check()
{
// the first time walltimer doesnt exist
if (MinecraftClient.ChatBots.DiscordWallTimer.wallTimer != null)
{
MinecraftClient.ChatBots.DiscordWallTimer.wallTimer.Stop();
}
Program.StartTimer();
}
public class DiscordWallTimer
{
public static System.Timers.Timer wallTimer;
internal static Task StartTimer()
{
Console.WriteLine("Wall timer has started");
wallTimer = new Timer()
{
Interval = 5*1000,
AutoReset = true,
Enabled = true // <- keep True
};
wallTimer.Elapsed += OnTimerTicked;
return Task.CompletedTask;
}
private static void OnTimerTicked(object sender, ElapsedEventArgs e)
{
Program.SendAlertDiscord();
}
}