Exemplo n.º 1
0
        /// <summary>
        /// Запуск обработчиков.
        /// Возможен перезапуск после вызова метода Stop()
        /// </summary>
        public void Start()
        {
            if (_isDisposed)
            {
                throw new ObjectDisposedException(this.GetType().Name);
            }

            var prevState = State;

            if (prevState != QueueAsyncProcessorState.Created && prevState != QueueAsyncProcessorState.Stopped)
            {
                throw new InvalidOperationException("Can't start QueueAsyncProcessor cause it is in wrong state: " + prevState.ToString());
            }

            if (Interlocked.CompareExchange(ref _state, (int)QueueAsyncProcessorState.StartPending, (int)prevState) != (int)prevState)
            {
                throw new InvalidOperationException("Can't start QueueAsyncProcessor cause it is in wrong state: " + State.ToString());
            }


            _threadWaitCancelation = new CancellationTokenSource();

            for (int i = 0; i < _procThreads.Length; i++)
            {
                _procThreads[i] = new Thread(new ThreadStart(ThreadProcFunc));
                _procThreads[i].IsBackground = _isBackground;
                if (_name != null)
                {
                    _procThreads[i].Name = string.Format("QueueAsyncProcessor. {0}. Thread #{1}", _name, i.ToString());
                }
                _procThreads[i].Start();
            }

            _lockAdding = false;

            prevState = (QueueAsyncProcessorState)Interlocked.CompareExchange(ref _state, (int)QueueAsyncProcessorState.InWork, (int)QueueAsyncProcessorState.StartPending);
            Contract.Assume(prevState == QueueAsyncProcessorState.StartPending || prevState == QueueAsyncProcessorState.Disposed);

            if (_isDisposed && _threadWaitCancelation != null)
            {
                _threadWaitCancelation.Cancel();
            }
        }