public PoolWorker(ThreadPoolSettings settings, CancellationToken cancelToken) { _settings = settings; _cancelToken = cancelToken; Name = Guid.NewGuid().ToString(); _status = PoolWorkerStatus.Ready; _timer = new System.Timers.Timer() { AutoReset = true, Enabled = true, }; _timer.Interval = settings.ThreadIdleTimeout.TotalMilliseconds; _timer.Elapsed += OnIdleTimeoutCheckEvent; StartThread(); }
private void ProcessWorkItems() { try { foreach (var job in _queue.GetConsumingEnumerable(_cancelToken)) { ExecuteJob(job); _lastItemProcesTime = DateTime.UtcNow; } } catch (OperationCanceledException op) { OnWorkItemException(null, op); } finally { _status = PoolWorkerStatus.Exiting; WorkerThreadExited(); lock (_queue) { _queue.Dispose(); } } }
private void StartThread() { _thread = new System.Threading.Thread(ProcessWorkItems) { Name = this.Name, IsBackground = true }; _thread.Start(); _status = PoolWorkerStatus.Running; }
private void OnIdleTimeoutCheckEvent(object sender, ElapsedEventArgs e) { //check if thread is idle for long time, and if so, signal exit. if (ShouldThreadExit()) { this._status = PoolWorkerStatus.Exiting; lock (_queue) { _queue.CompleteAdding(); } } }