Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }