/// <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; } }
/// <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; } }