/// <summary>
 /// Сигнализирует потоку, что пора заканчивать
 /// </summary>
 public void terminate()
 {
     lock (_storeThreadStateLock)
     {
         _storeThreadState = StoreThreadStates.Terminating;
     }
 }
        /// <summary>
        /// Конструктор
        /// </summary>
        /// <param name="storeLogic">Объект, содержащий логику рабочего потока</param>
        public StoreThread(ThreadStart storeLogic)
        {
            _storeLogic = storeLogic;

            // Создаём рабочий поток
            _storeThreadState = StoreThreadStates.Working;
            _storeThread      = new Thread(threadMethod);

            // Приоритет назначаем ниже обычного
            _storeThread.Priority = ThreadPriority.BelowNormal;
        }
        /// <summary>
        /// Тело рабочего потока
        /// </summary>
        void threadMethod()
        {
            StoreThreadStates threadState;

            do
            {
                // Выполняем логику итерации потока
                _storeLogic.Invoke();

                // И проверяем, не пора ли завершаться
                lock (_storeThreadStateLock)
                {
                    threadState = _storeThreadState;
                }
            }while (threadState == StoreThreadStates.Working);

            // После завершения устанавливаем признак, что работа закончена
            lock (_storeThreadStateLock)
            {
                _storeThreadState = StoreThreadStates.Terminated;
            }
        }