public async Task Dispatch(IAsyncAction <TState> action) { if (_dispatchDepth <= 0) { await DoDispatch(); } else { _dispatchQueue.Enqueue(DoDispatch); } async Task DoDispatch() { var nextState = await action.Apply(_state, this); SetState(nextState, action); } }
public Task <TResult> Dispatch <TResult>(IAsyncAction <TState, TResult> action) { if (_dispatchDepth <= 0) { return(DoDispatch()); } else { var promise = new TaskCompletionSource <TResult>(); _dispatchQueue.Enqueue(() => DoDispatch(promise)); return(promise.Task); } async Task <TResult> DoDispatch(TaskCompletionSource <TResult> promise = null) { var(nextState, result) = await action.Apply(_state, this); SetState(nextState, action); promise?.SetResult(result); return(result); } }