如果在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/

10-12 01:44
查看更多