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) { // Flow the exception back through the OWIN pipeline. tcs.TrySetException(ex); result.TryComplete(); return(result); } 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; }
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); AppFunc 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; // System.Web does not allow us to use async void methods to complete the IAsyncResult due to the special sync context. #pragma warning disable 4014 RunApp(entryPoint, environment, tcs, result); #pragma warning restore 4014 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); AppFunc 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; // System.Web does not allow us to use async void methods to complete the IAsyncResult due to the special sync context. #pragma warning disable 4014 RunApp(entryPoint, environment, tcs, result); #pragma warning restore 4014 result.InitialThreadReturning(); return(result); }
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) { // System.Web does not allow us to use async void methods to complete the IAsyncResult due to the special sync context. #pragma warning disable 4014 DoFinalWork(result); #pragma warning restore 4014 } else { result.TryComplete(); } result.InitialThreadReturning(); return(result); }
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) { // System.Web does not allow us to use async void methods to complete the IAsyncResult due to the special sync context. #pragma warning disable 4014 DoFinalWork(result); #pragma warning restore 4014 } else { result.TryComplete(); } result.InitialThreadReturning(); return result; }
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; }