예제 #1
0
        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);
            }
        }
예제 #2
0
        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);
            }
        }