0
       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 分ごとにメッセージを出力する必要があります。これを行うための最良の方法は何だろうと思っています。

乾杯

4

1 に答える 1

0

そのためのスレッドは必要ありません。タイマーが必要です。

    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();

必要なすべてのコードが 1 つの整然としたパッケージに収められています。クラスでラップすることもできます。

于 2015-08-14T22:02:49.290 に答える