private IAsyncResult BeginFinalWork(object sender, EventArgs e, AsyncCallback cb, object extradata)
        {
            var result = new StageAsyncResult(cb, extradata, () => { });
            TaskCompletionSource <object> tcs = TakeLastCompletionSource();

            if (tcs != null)
            {
                tcs.TrySetResult(null);
            }
            if (_state.OriginalTask != null)
            {
                _state.OriginalTask
                .Then(() =>
                {
                    _state.CallContext.OnEnd();
                    CallContextAsyncResult.End(_state.CallContext.AsyncResult);
                    result.TryComplete();
                })
                .Catch(error =>
                {
                    result.Fail(ErrorState.Capture(error.Exception));
                    return(error.Handled());
                });
            }
            else
            {
                result.TryComplete();
            }
            result.InitialThreadReturning();
            return(result);
        }
 private async Task DoFinalWork(StageAsyncResult result)
 {
     try
     {
         await _state.OriginalTask;
         _state.CallContext.OnEnd();
         CallContextAsyncResult.End(_state.CallContext.AsyncResult);
         result.TryComplete();
     }
     catch (Exception ex)
     {
         _state.CallContext.AbortIfHeaderSent();
         result.Fail(ErrorState.Capture(ex));
     }
 }