public void RunSynchronously() { CleanUp(); for (; ;) { var state = _provider.TryGetNextAvailableTask(out var newId); switch (state) { case TaskProviderState.Normal: _provider.MarkAsRunning(newId); try { _provider.RunTaskSynchronously(newId); } catch (Exception e) { _exceptions.Add(new TaskException <T> { Identifier = newId, InnerException = e }); } finally { _provider.MarkAsCompleted(newId); } break; case TaskProviderState.NoAvailableTask: throw new InvalidOperationException(); case TaskProviderState.AllComplete: case TaskProviderState.Abort: return; default: throw new ArgumentOutOfRangeException(nameof(state)); } } }