【问题标题】:C# Timed Messages from a server restart来自服务器重启的 C# 定时消息
【发布时间】:2015-08-13 19:10:55
【问题描述】:
       private void WorkerThread()
    {
        AppConsole.Log("Restarter Worker Thread Started", ConsoleColor.Green);
        DateTime nextRestart = GetRestartTime(); //--- Fetch next restart
        AppConsole.Log(String.Format("Selected next restart date: {0}", nextRestart.ToString("F")), ConsoleColor.Green);
        _workerRunning = true;

        while (_workerRunning) {
            _waitHandle.WaitOne(1000);
            TimeSpan timeLeft = nextRestart.Subtract(DateTime.Now);
            SendMessage(String.Format("Time until next restart: {0} hours, {1} minutes, {2} seconds.",
                timeLeft.Hours, timeLeft.Minutes, timeLeft.Seconds));
            if (timeLeft.CompareTo(TimeSpan.Zero) < 0)
                DoRestart();
        }

基本上,如果服务器距离重新启动超过 10 分钟,我需要每 5 分钟输出一条消息,如果服务器距离启动不到 10 分钟,我需要每 2.5 分钟输出一条消息。我只是想知道最好的方法是什么。

干杯

【问题讨论】:

    标签: c# gettime


    【解决方案1】:

    你不需要线程,你需要一个计时器。

        DateTime nextRestart = GetRestartTime();
        AppConsole.Log("Restarter timer started", ConsoleColor.Green);
        Timer t = new Timer();
        t.Tick += (o, e) =>
        {
            TimeSpan timeLeft = nextRestart.Subtract(DateTime.Now);
    
            if (timeLeft.CompareTo(TimeSpan.Zero) < 0)
            {
                t.Stop();
                DoRestart();
            }
            else
            {
                SendMessage(String.Format("Time until next restart: {0} hours, {1} minutes, {2} seconds.",
                    timeLeft.Hours, timeLeft.Minutes, timeLeft.Seconds));
                if (timeLeft.CompareTo(TimeSpan.FromMinutes(5)) < 0)
                    t.Interval = 150 * 60 * 1000; // ms
                else if (timeLeft.CompareTo(TimeSpan.FromMinutes(10)) < 0)
                    t.Interval = 300 * 60 * 1000; // ms
            }
        };
        t.Interval = (nextRestart - DateTime.Now).Milliseconds;
        t.Start();
    

    一个整洁的包中包含您需要的所有代码。你甚至可以将它包装在一个类中。

    【讨论】:

    • 如果您解决了量化方面的问题,您的答案会更完整。如果进程在 16 分钟后重新启动,那么 OP 是否希望在 11:00、6:00、3:30 和 1:00 分钟或 15:00、10:00、7:30、还剩 5:00 和 2:30 分钟?另外,考虑是否还有 10:01 分钟。您的代码会将下一个警报设置为 5:01 而不是 7:51,因此需要进行一些调整。
    • 对,代码并不完美。比如原来的间隔需要减少警告时间;事实上,它不会工作。但它确实回答了解决问题的最佳方法的问题。 @ErikE至于量化,如果将原始时间设置为过期1ms,则比较不会有问题。至于时间,间隔将与预期一致,因为它们是根据重置时间计算的,而不是当前时间。
    猜你喜欢
    • 1970-01-01
    • 2014-02-08
    • 2018-05-10
    • 1970-01-01
    • 1970-01-01
    • 2018-05-25
    • 1970-01-01
    • 2020-12-15
    • 2012-02-16
    相关资源
    最近更新 更多