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