除非在一定时间内未调用函数,否则计时器不会启动

时间:2018-09-11 04:51:31

标签: c# discord.net

.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秒。) 预先感谢!

2 个答案:

答案 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();
        }
}