当 .checked
命令在 15 分钟内未完成时,我希望计时器每分钟发送一条垃圾邮件。现在,出于测试目的,我将其设置为一些快得离谱的数量。 Check()
在 .checked 完成时调用。
我试过这样做:
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 秒。)提前致谢!
我建议使用专为执行此类操作而设计的库,而不是摆弄计时器 - 这可能很困难。
试试微软的 Reactive Framework:
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
一次,然后每当您调用 Check()
时,您将启动一个 15 分钟的计时器,然后每分钟发送一次垃圾邮件。对 Check()
的任何调用都会自动重置计时器。
如果您想关闭代码,请调用 _subscription.Dispose();
。
只需 NuGet "System.Reactive"获取位,然后将 using System.Reactive.Linq;
添加到您的代码中。
如果您有任何线程问题,请告诉我,我会帮助您将代码编码到正确的线程。
我是一名优秀的程序员,十分优秀!