public static CustomThreadPool CreatePool(PoolType type,ThreadPoolSettings config, CancellationToken tk)
 {
     switch (type)
     {
         case PoolType.Custom1:
             return new CustomThreadPool1(config, tk);
         case PoolType.Custom2:
             return new CustomThreadPool2(config, tk);
         case PoolType.Custom3:
             return new CustomThreadPool3(config, tk);
         default:
             return new DefaultThreadPool(config, tk);
     }
 }
 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();
 }
        /// <summary>
        /// Creates new threadpool with given settings and cancel token values
        /// </summary>
        /// <param name="settings">thread pool runtime settings</param>
        /// <param name="cancelToken">cancel token to indicate or send stop event to the pool</param>
        public CustomThreadPool3(ThreadPoolSettings settings, CancellationToken cancelToken)
            : base(settings, cancelToken)
        {
            _settings = settings;
            _linkedCts = CancellationTokenSource.CreateLinkedTokenSource(cancelToken);
            this._poolStopToken = _linkedCts.Token;
            _tokenRegister = _poolStopToken.Register(OnPoolCancelRequested);

            //start minimum required threads immediately
            _mThreads = new Thread[_settings.MaxThreads];
            _mThreadLocalQueues = new ThreadLocalStealQueue<ThreadPoolWorkItem>[_settings.MaxThreads];

            for (int i = 0; i < _settings.MinThreads; i++)
            {
                StartNewThread(true);
            }

            EtwLogger.Log.PoolStarted(Name, _settings.MinThreads, _settings.MaxThreads);
        }
        public CustomThreadPool2(ThreadPoolSettings settings, CancellationToken cancelToken)
            : base(settings, cancelToken)
        {
            if (settings == null) throw new ArgumentNullException("settings");

            this._settings = settings;
            _workerKeys = new List<string>(settings.MaxThreads);

            //initialize min threads immediately
            for (int i = 0; i < settings.MinThreads; i++)
            {
                var w = AllocDelegate();
                w.IsPermenant = true;
                _workerThreads.TryAdd(w.Name, w);
                _workerKeys.Add(w.Name);
            }

            _linkedCts = CancellationTokenSource.CreateLinkedTokenSource(cancelToken);
            this._poolStopToken = _linkedCts.Token;
            _tokenRegister = _poolStopToken.Register(OnPoolCancelRequested);
            EtwLogger.Log.PoolStarted(Name, _settings.MinThreads, _settings.MaxThreads);
        }
 /// <summary>
 /// Creates custom worker thread pool with default name and given settings.
 /// </summary>
 protected CustomThreadPool(ThreadPoolSettings settings, CancellationToken cancelToken)
 {
     this.Name = string.Format(CultureInfo.InvariantCulture, "ThreadPool-{0}", Guid.NewGuid());
 }