private async Task ExecuteNextAsync() { while (!_actions.IsEmpty) { var gotLock = false; try { if (!(gotLock = _locker.TryGetLock())) { return; } while (!_actions.IsEmpty) { if (!_actions.TryDequeue(out var actionTuple)) { continue; } try { var result = await actionTuple.Item2(); actionTuple.Item1.TrySetResult(result); } catch (Exception exc) { actionTuple.Item1.TrySetException(exc); } } } finally { if (gotLock) { _locker.ReleaseLock(); } } } }
private async Task ExecuteNext() { while (!actions.IsEmpty) { bool gotLock = false; try { if (!(gotLock = locker.TryGetLock())) { return; } while (!actions.IsEmpty) { Tuple <TaskCompletionSource <TResult>, Func <Task <TResult> > > actionTuple; if (actions.TryDequeue(out actionTuple)) { try { TResult result = await actionTuple.Item2(); actionTuple.Item1.TrySetResult(result); } catch (Exception exc) { actionTuple.Item1.TrySetException(exc); } } } } finally { if (gotLock) { locker.ReleaseLock(); } } } }