private void StartMonitorThreads() { lock (monitor) { if (monitorStarted.Value || maxInactivityDuration == 0) { return; } Tracer.DebugFormat("Inactivity: Write Check time interval: {0}", maxInactivityDuration); Tracer.DebugFormat("Inactivity: Initial Delay time interval: {0}", maxInactivityDurationInitialDelay); this.asyncWriteTask = new AsyncWriteTask(this); this.asyncTask = new DedicatedTaskRunner(this.asyncWriteTask); monitorStarted.Value = true; this.connectionCheckTimer = new Timer( new TimerCallback(WriteCheck), null, maxInactivityDurationInitialDelay, maxInactivityDuration ); } }
private void StopMonitorThreads() { lock (monitor) { if (monitorStarted.CompareAndSet(true, false)) { // Attempt to wait for the Timer to shutdown, but don't wait // forever, if they don't shutdown after two seconds, just quit. ThreadUtil.DisposeTimer(connectionCheckTimer, 2000); this.asyncTask.Shutdown(); this.asyncTask = null; this.asyncWriteTask = null; } } }
public void Wakeup() { ITaskRunner taskRunner; lock ( _syncRoot ) { if (_taskRunner == null) { _taskRunner = new DedicatedTaskRunner(this); } taskRunner = _taskRunner; } taskRunner.Wakeup(); }
public void TestSimple() { try { new DedicatedTaskRunner(null); Assert.Fail("Should throw a NullReferenceException"); } catch { } SimpleCountingTask simpleTask = new SimpleCountingTask(); Assert.IsTrue(simpleTask.Count == 0); DedicatedTaskRunner simpleTaskRunner = new DedicatedTaskRunner(simpleTask); simpleTaskRunner.Wakeup(); Thread.Sleep(500); Assert.IsTrue(simpleTask.Count >= 1); simpleTaskRunner.Wakeup(); Thread.Sleep(500); Assert.IsTrue(simpleTask.Count >= 2); InfiniteCountingTask infiniteTask = new InfiniteCountingTask(); Assert.IsTrue(infiniteTask.Count == 0); DedicatedTaskRunner infiniteTaskRunner = new DedicatedTaskRunner(infiniteTask); Thread.Sleep(500); Assert.IsTrue(infiniteTask.Count != 0); infiniteTaskRunner.Shutdown(); uint count = infiniteTask.Count; Thread.Sleep(500); Assert.IsTrue(infiniteTask.Count == count); }