protected internal virtual IAsyncResult BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, object state) { return(SecurityUtil.ProcessInApplicationTrust(() => { IController controller; IControllerFactory factory; ProcessRequestInit(httpContext, out controller, out factory); IAsyncController asyncController = controller as IAsyncController; if (asyncController != null) { // asynchronous controller BeginInvokeDelegate beginDelegate = delegate(AsyncCallback asyncCallback, object asyncState) { try { return asyncController.BeginExecute(RequestContext, asyncCallback, asyncState); } catch { factory.ReleaseController(asyncController); throw; } }; EndInvokeDelegate endDelegate = delegate(IAsyncResult asyncResult) { try { asyncController.EndExecute(asyncResult); } finally { factory.ReleaseController(asyncController); } }; SynchronizationContext syncContext = SynchronizationContextUtil.GetSynchronizationContext(); AsyncCallback newCallback = AsyncUtil.WrapCallbackForSynchronizedExecution(callback, syncContext); return AsyncResultWrapper.Begin(newCallback, state, beginDelegate, endDelegate, _processRequestTag); } else { // synchronous controller Action action = delegate { try { controller.Execute(RequestContext); } finally { factory.ReleaseController(controller); } }; return AsyncResultWrapper.BeginSynchronous(callback, state, action, _processRequestTag); } })); }
public void WrapCallbackForSynchronizedExecution_DoesNotCallSyncIfOperationCompletedSynchronously() { // Arrange MockAsyncResult asyncResult = new MockAsyncResult() { CompletedSynchronously = true, IsCompleted = true }; bool originalCallbackCalled = false; AsyncCallback originalCallback = ar => { Assert.Equal(asyncResult, ar); originalCallbackCalled = true; }; DummySynchronizationContext syncContext = new DummySynchronizationContext(); // Act AsyncCallback retVal = AsyncUtil.WrapCallbackForSynchronizedExecution(originalCallback, syncContext); retVal(asyncResult); // Assert Assert.True(originalCallbackCalled); Assert.False(syncContext.SendCalled); }
public void WrapCallbackForSynchronizedExecution_ReturnsNullIfCallbackIsNull() { // Act AsyncCallback retVal = AsyncUtil.WrapCallbackForSynchronizedExecution(null, new SynchronizationContext()); // Assert Assert.Null(retVal); }
public void WrapCallbackForSynchronizedExecution_ReturnsOriginalCallbackIfSyncContextIsNull() { // Arrange AsyncCallback originalCallback = _ => { }; // Act AsyncCallback retVal = AsyncUtil.WrapCallbackForSynchronizedExecution(originalCallback, null); // Assert Assert.Same(originalCallback, retVal); }