如果在15分钟内未执行命令.checked
,我希望计时器每分钟发送一次垃圾邮件。现在,出于测试目的,我将其设置为一些非常快的数量。 .checked完成后,将调用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秒。)
提前致谢!
最佳答案
我建议使用设计用于执行此类操作的库,而不是随意使用计时器-这可能很难。
试用Microsoft的反应式框架:
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;
添加到您的代码中。如果您有任何线程问题,请告诉我,我将帮助您将代码整理到适合您的线程。
关于c# - 除非功能未调用一定时间,否则计时器不会启动,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52268864/