/// <summary> /// ウォッチドッグを開始する /// </summary> /// <param name="timeout">ウォッチドッグタイムアウト時間(ミリ秒)。省略または0以下を指定した時は以前の設定を継続する</param> /// <param name="mode">ウォッチドッグ発動時の動作。省略時は以前の設定を継続する</param> /// <remarks> /// <para> /// このスレッド用のウォッチドッグ用のスレッドが作成されて監視します。 /// ただし、すでにウォッチドッグスレッドが作成されている場合は、ウォッチ /// ドッグタイマのリセットだけを行なうことになります。 /// 同一スレッドで次にWatchdog / StopWatchdogが呼ばれる前にtimeoutミリ秒 /// が経過すると、modeで指定した動作が起こります。 /// タイムアウトでスレッドをAbortする際には、ExceptionStateに /// TimeoutExceptionオブジェクトがセットされます。 /// </para> /// </remarks> public static void Watchdog(int timeout = 0, WatchdogMode mode = WatchdogMode.Keep) { NThread nth = CurrentThread; if (nth != null) { nth.watchdog((long)timeout, mode); } }
private void watchdog(long timeout, WatchdogMode mode) { if (watchdogTimer == null) { watchdogTimer = new Stopwatch(); } lock (watchdogTimer) { if (timeout > 0) { watchdogTimeout = timeout; // 監視周期はwatchdogTimeout/10。ただし最低1msec、最大1000msec。 if (watchdogTimeout < 10) { watchdogCycle = 1; } else if (watchdogTimeout < (long)MAX_WATCHDOG_CYCLE * 10) { watchdogCycle = (int)(watchdogTimeout / 10L); } else { watchdogCycle = MAX_WATCHDOG_CYCLE; } } watchdogTimer.Restart(); if (mode != WatchdogMode.Keep) { watchdogMode = mode; } watchdogCount = 0; } if (watchdogThread == null) { watchdogThread = new Thread(doWatchdog); watchdogThread.Name = this.Name + "-watchdog"; watchdogThread.IsBackground = true; watchdogThread.Start(); } }