public PerformanceBalancerThread(PerformanceBalancer performanceBalancer, PerformanceBalanceSettings settings)
            : base()
        {
            this.settings = settings;

            this.performanceBalancer = performanceBalancer;

            managedThread.IsBackground = true;
            managedThread.Name         = "PerformanceBalancerThread";

            managedThread.Start();
        }
        /// <summary>
        /// Главный цикл
        /// </summary>
        protected override void DoLoop()
        {
            Thread.Sleep(settings.ActionInterval);

            try
            {
                while (!cancellationTokenSource.IsCancellationRequested)
                {
                    performanceBalancer.DoAction();

                    // я не могу использовать Timer из за того, что нельзя использовать ThreadPool
                    // поэтому пользуюсь Thread.Sleep
                    Thread.Sleep(settings.ActionInterval);
                }
            }
            finally
            {
                // Теряем ссылку на объект, что бы не мешать GC. Между окончанием потока и высвобождением стека может пройти какое-то время.
                performanceBalancer = null;
            }
        }