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); }
public IAsyncResult BeginEvent(object sender, EventArgs e, AsyncCallback cb, object extradata) { if (_result != null) { throw new InvalidOperationException(); } if (_context.PreventNextStage) { var noop = new StageAsyncResult(cb, extradata, () => { }); noop.TryComplete(); noop.InitialThreadReturning(); return(noop); } _context.PreventNextStage = true; _responseShouldEnd = true; _context.PushExecutingStage(this); Func <IDictionary <string, object>, Task> entryPoint = _stage.EntryPoint ?? _context.PrepareInitialContext((HttpApplication)sender); IDictionary <string, object> environment = _context.TakeLastEnvironment(); TaskCompletionSource <object> tcs = _context.TakeLastCompletionSource(); var result = new StageAsyncResult(cb, extradata, () => { var application = ((HttpApplication)sender); if (_responseShouldEnd) { application.CompleteRequest(); } }); _result = result; environment[Constants.IntegratedPipelineCurrentStage] = _stage.Name; try { entryPoint.Invoke(environment) .CopyResultToCompletionSource(tcs, null) .ContinueWith(t => result.TryComplete(), TaskContinuationOptions.ExecuteSynchronously) .Catch(ci => ci.Handled()); } catch (Exception ex) { result.Fail(ErrorState.Capture(ex)); tcs.TrySetException(ex); return(result); } 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)); } }
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; }
public IAsyncResult BeginEvent(object sender, EventArgs e, AsyncCallback cb, object extradata) { if (_result != null) { throw new InvalidOperationException(); } if (_context.PreventNextStage) { var noop = new StageAsyncResult(cb, extradata, () => { }); noop.TryComplete(); noop.InitialThreadReturning(); return noop; } _context.PreventNextStage = true; _responseShouldEnd = true; _context.PushExecutingStage(this); Func<IDictionary<string, object>, Task> entryPoint = _stage.EntryPoint ?? _context.PrepareInitialContext((HttpApplication)sender); IDictionary<string, object> environment = _context.TakeLastEnvironment(); TaskCompletionSource<object> tcs = _context.TakeLastCompletionSource(); var result = new StageAsyncResult(cb, extradata, () => { var application = ((HttpApplication)sender); if (_responseShouldEnd) { application.CompleteRequest(); } }); _result = result; environment[Constants.IntegratedPipelineCurrentStage] = _stage.Name; try { entryPoint.Invoke(environment) .CopyResultToCompletionSource(tcs, null) .ContinueWith(t => result.TryComplete(), TaskContinuationOptions.ExecuteSynchronously) .Catch(ci => ci.Handled()); } catch (Exception ex) { result.Fail(ErrorState.Capture(ex)); tcs.TrySetException(ex); return result; } result.InitialThreadReturning(); return result; }