Пример #1
0
        /// <summary>
        /// Executes all currently queued tasks. This method will not return until every task has completed.
        /// </summary>
        public void Execute()
        {
            if (_disposing)
            {
                throw new InvalidOperationException();
            }
            if (_running)
            {
                throw new InvalidOperationException();
            }

            if (_tasks.Count < 1)
            {
                return;
            }
            _running = true;

            try
            {
                if (!_isThreadingEnabled)
                {
                    for (int i = 0; i < _tasks.Count; i++)
                    {
                        _tasks[i](_params[i]);
                    }
                }
                else
                {
                    _currentTaskIndex   = 0;
                    _waitingThreadCount = 0;
                    _managerCurrentWaitHandle.Set();

                    TaskPump();

                    while (_waitingThreadCount < _threadCount - 1)
                    {
                        Thread.Sleep(0);
                    }

                    if (_exceptions.Count > 0)
                    {
                        var e = new TaskManagerException(_exceptions.ToArray());
                        _exceptions.Clear();
                        throw e;
                    }
                }
            }
            finally
            {
                _managerCurrentWaitHandle.Reset();
                _managerCurrentWaitHandle = _managerCurrentWaitHandle == _managerWaitHandleA
                                        ? _managerWaitHandleB : _managerWaitHandleA;
                _tasks.Clear();
                _params.Clear();
                _running = false;
            }
        }
Пример #2
0
		/// <summary>
		/// Executes all currently queued tasks. This method will not return until every task has completed.
		/// </summary>
		public void Execute()
		{
			if (_disposing) throw new InvalidOperationException();
			if (_running) throw new InvalidOperationException();

			if (_tasks.Count < 1) return;
			_running = true;

			try
			{
				if (!_isThreadingEnabled)
				{
					for (int i = 0; i < _tasks.Count; i++)
						_tasks[i](_params[i]);
				}
				else
				{
					_currentTaskIndex = 0;
					_waitingThreadCount = 0;
					_managerCurrentWaitHandle.Set();

					TaskPump();

					while (_waitingThreadCount < _threadCount - 1)
					{
						Thread.Sleep(0);
					}

					if (_exceptions.Count > 0)
					{
						var e = new TaskManagerException(_exceptions.ToArray());
						_exceptions.Clear();
						throw e;
					}
				}
			}
			finally
			{
				_managerCurrentWaitHandle.Reset();
				_managerCurrentWaitHandle = _managerCurrentWaitHandle == _managerWaitHandleA
					? _managerWaitHandleB : _managerWaitHandleA;
				_tasks.Clear();
				_params.Clear();
				_running = false;
			}
		}