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)); } }