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