/// <summary> /// Execute the work item /// </summary> private void ExecuteWorkItem() { CallerThreadContext ctc = null; if (null != _callerContext) { ctc = CallerThreadContext.Capture(_callerContext.CapturedCallContext, _callerContext.CapturedHttpContext); CallerThreadContext.Apply(_callerContext); } Exception exception = null; object result = null; try { result = _callback(_state); } catch (Exception e) { // Save the exception so we can rethrow it later exception = e; } if (null != _callerContext) { CallerThreadContext.Apply(ctc); } SetResult(result, exception); }
/// <summary> /// Captures the current thread context /// </summary> /// <returns></returns> public static CallerThreadContext Capture( bool captureCallContext, bool captureHttpContext) { Debug.Assert(captureCallContext || captureHttpContext); CallerThreadContext callerThreadContext = new CallerThreadContext(); // TODO: In NET 2.0, redo using the new feature of ExecutionContext class - Capture() // Capture Call Context if (captureCallContext && (getLogicalCallContextMethodInfo != null)) { callerThreadContext._callContext = (LogicalCallContext)getLogicalCallContextMethodInfo.Invoke(Thread.CurrentThread, null); if (callerThreadContext._callContext != null) { callerThreadContext._callContext = (LogicalCallContext)callerThreadContext._callContext.Clone(); } } // Capture httpContext if (captureHttpContext && (null != HttpContext.Current)) { callerThreadContext._httpContext = HttpContext.Current; } return(callerThreadContext); }
/// <summary> /// Captures the current thread context /// </summary> /// <returns></returns> public static CallerThreadContext Capture( bool captureCallContext, bool captureHttpContext) { // Remove this check since if the original call didn't have any context, we don't need to capture it here //Debug.Assert(captureCallContext || captureHttpContext); CallerThreadContext callerThreadContext = new CallerThreadContext(); // TODO: In NET 2.0, redo using the new feature of ExecutionContext class - Capture() // Capture Call Context if (captureCallContext && (getLogicalCallContextMethodInfo != null)) { callerThreadContext._callContext = (LogicalCallContext)getLogicalCallContextMethodInfo.Invoke(Thread.CurrentThread, null); if (callerThreadContext._callContext != null) { callerThreadContext._callContext = (LogicalCallContext)callerThreadContext._callContext.Clone(); } } // Capture httpContext if (captureHttpContext && (null != HttpContext.Current)) { callerThreadContext._httpContext = HttpContext.Current; } return(callerThreadContext); }
/// <summary> /// Applies the thread context stored earlier /// </summary> /// <param name="callerThreadContext"></param> public static void Apply(CallerThreadContext callerThreadContext) { if (null == callerThreadContext) { throw new ArgumentNullException("callerThreadContext"); } // TODO: HH: In NET 2.0, redo using the new feature of ExecutionContext class - Run() // Restore call context if ((callerThreadContext._callContext != null) && (setLogicalCallContextMethodInfo != null)) { setLogicalCallContextMethodInfo.Invoke(Thread.CurrentThread, new object[] { callerThreadContext._callContext }); } }
// Token: 0x060017A7 RID: 6055 // RVA: 0x000739A0 File Offset: 0x00071BA0 public static void Apply(CallerThreadContext callerThreadContext_0) { if (callerThreadContext_0 == null) { throw new ArgumentNullException("callerThreadContext"); } if (callerThreadContext_0._callContext != null && CallerThreadContext.setLogicalCallContextMethodInfo != null) { CallerThreadContext.setLogicalCallContextMethodInfo.Invoke(Thread.CurrentThread, new object[] { callerThreadContext_0._callContext }); } if (callerThreadContext_0._httpContext != null) { HttpContext.Current = callerThreadContext_0._httpContext; } }
/// <summary> /// Initialize the callback holding object. /// </summary> /// <param name="callback">Callback delegate for the callback.</param> /// <param name="state">State with which to call the callback delegate.</param> /// /// We assume that the WorkItem object is created within the thread /// that meant to run the callback public WorkItem( IWorkItemsGroup workItemsGroup, WorkItemInfo workItemInfo, WorkItemCallback callback, object state) { _workItemsGroup = workItemsGroup; _workItemInfo = workItemInfo; if (_workItemInfo.UseCallerCallContext || _workItemInfo.UseCallerHttpContext) { _callerContext = CallerThreadContext.Capture(_workItemInfo.UseCallerCallContext, _workItemInfo.UseCallerHttpContext); } _callback = callback; _state = state; _workItemResult = new WorkItemResult(this); Initialize(); }
/// <summary> /// Initialize the callback holding object. /// </summary> /// <param name="workItemsGroup">The workItemGroup of the workitem</param> /// <param name="workItemInfo">The WorkItemInfo of te workitem</param> /// <param name="callback">Callback delegate for the callback.</param> /// <param name="state">State with which to call the callback delegate.</param> /// /// We assume that the WorkItem object is created within the thread /// that meant to run the callback public WorkItem( IWorkItemsGroup workItemsGroup, WorkItemInfo workItemInfo, WorkItemCallback callback, object state) { _workItemsGroup = workItemsGroup; _workItemInfo = workItemInfo; #if !(_WINDOWS_CE) && !(_SILVERLIGHT) && !(WINDOWS_PHONE) && !(NETSTANDARD2_0) if (_workItemInfo.UseCallerCallContext || _workItemInfo.UseCallerHttpContext) { _callerContext = CallerThreadContext.Capture(_workItemInfo.UseCallerCallContext, _workItemInfo.UseCallerHttpContext); } #endif _callback = callback; _state = state; _workItemResult = new WorkItemResult(this); Initialize(); }
/// <summary> /// Applies the thread context stored earlier /// </summary> /// <param name="callerThreadContext"></param> public static void Apply(CallerThreadContext callerThreadContext) { if (null == callerThreadContext) { throw new ArgumentNullException("callerThreadContext"); } // Todo: In NET 2.0, redo using the new feature of ExecutionContext class - Run() // Restore call context if ((callerThreadContext._callContext != null) && (setLogicalCallContextMethodInfo != null)) { setLogicalCallContextMethodInfo.Invoke(Thread.CurrentThread, new object[] { callerThreadContext._callContext }); } // Restore HttpContext if (callerThreadContext._httpContext != null) { HttpContext.Current = callerThreadContext._httpContext; //CallContext.SetData(HttpContextSlotName, callerThreadContext._httpContext); } }
/// <summary> /// Applies the thread context stored earlier /// </summary> /// <param name="callerThreadContext"></param> public static void Apply(CallerThreadContext callerThreadContext) { if (null == callerThreadContext) { throw new ArgumentNullException("callerThreadContext"); } // Apply user information if (callerThreadContext.CapturedUserInfo) { Thread.CurrentThread.CurrentCulture = callerThreadContext._culture; Thread.CurrentThread.CurrentUICulture = callerThreadContext._uiCulture; Thread.CurrentPrincipal = callerThreadContext._principal; } // Restore HttpContext if (callerThreadContext._httpContext != null) { HttpContext.Current = callerThreadContext._httpContext; //CallContext.SetData(HttpContextSlotName, callerThreadContext._httpContext); } }
/// <summary> /// Captures the current thread context /// </summary> /// <returns></returns> public static CallerThreadContext Capture( bool captureUserInfo, bool captureHttpContext) { Debug.Assert(captureUserInfo || captureHttpContext); CallerThreadContext callerThreadContext = new CallerThreadContext(); // Capture userinfo if (captureUserInfo) { callerThreadContext._principal = Thread.CurrentPrincipal; callerThreadContext._culture = Thread.CurrentThread.CurrentCulture; callerThreadContext._uiCulture = Thread.CurrentThread.CurrentUICulture; } // Capture httpContext if (captureHttpContext && (null != HttpContext.Current)) { callerThreadContext._httpContext = HttpContext.Current; } return(callerThreadContext); }
/// <summary> /// Captures the current thread context /// </summary> /// <returns></returns> public static CallerThreadContext Capture( bool captureCallContext, bool captureHttpContext) { Debug.Assert(captureCallContext || captureHttpContext); CallerThreadContext callerThreadContext = new CallerThreadContext(); // TODO: In NET 2.0, redo using the new feature of ExecutionContext class - Capture() // Capture Call Context if(captureCallContext && (getLogicalCallContextMethodInfo != null)) { callerThreadContext._callContext = (LogicalCallContext)getLogicalCallContextMethodInfo.Invoke(Thread.CurrentThread, null); if (callerThreadContext._callContext != null) { callerThreadContext._callContext = (LogicalCallContext)callerThreadContext._callContext.Clone(); } } // Capture httpContext if (captureHttpContext && (null != HttpContext.Current)) { callerThreadContext._httpContext = HttpContext.Current; } return callerThreadContext; }
/// <summary> /// Execute the work item /// </summary> private void ExecuteWorkItem() { #if (NETFRAMEWORK) CallerThreadContext ctc = null; if (null != _callerContext) { ctc = CallerThreadContext.Capture(_callerContext.CapturedCallContext, _callerContext.CapturedHttpContext); CallerThreadContext.Apply(_callerContext); } #endif Exception exception = null; object result = null; try { try { result = _callback(_state); } catch (Exception e) { // Save the exception so we can rethrow it later exception = e; } // Remove the value of the execution thread, so it will be impossible to cancel the work item, // since it is already completed. // Cancelling a work item that already completed may cause the abortion of the next work item!!! Thread executionThread = Interlocked.CompareExchange(ref _executingThread, null, _executingThread); if (null == executionThread) { // Oops! we are going to be aborted..., Wait here so we can catch the ThreadAbortException Thread.Sleep(60 * 1000); // If after 1 minute this thread was not aborted then let it continue working. } } // We must treat the ThreadAbortException or else it will be stored in the exception variable catch (ThreadAbortException tae) { tae.GetHashCode(); // Check if the work item was cancelled // If we got a ThreadAbortException and the STP is not shutting down, it means the // work items was cancelled. if (!SmartThreadPool.CurrentThreadEntry.AssociatedSmartThreadPool.IsShuttingdown) { Thread.ResetAbort(); } } #if (NETFRAMEWORK) if (null != _callerContext) { CallerThreadContext.Apply(ctc); } #endif if (!SmartThreadPool.IsWorkItemCanceled) { SetResult(result, exception); } }
/// <summary> /// Initialize the callback holding object. /// </summary> /// <param name="workItemsGroup">The workItemGroup of the workitem</param> /// <param name="workItemInfo">The WorkItemInfo of te workitem</param> /// <param name="callback">Callback delegate for the callback.</param> /// <param name="state">State with which to call the callback delegate.</param> /// /// We assume that the WorkItem object is created within the thread /// that meant to run the callback public WorkItem( IWorkItemsGroup workItemsGroup, WorkItemInfo workItemInfo, WorkItemCallback callback, object state) { _workItemsGroup = workItemsGroup; _workItemInfo = workItemInfo; #if !(_WINDOWS_CE) && !(_SILVERLIGHT) && !(WINDOWS_PHONE) if (_workItemInfo.UseCallerCallContext || _workItemInfo.UseCallerHttpContext) { _callerContext = CallerThreadContext.Capture(_workItemInfo.UseCallerCallContext, _workItemInfo.UseCallerHttpContext); } #endif _callback = callback; _state = state; _workItemResult = new WorkItemResult(this); Initialize(); }
/// <summary> /// Execute the work item /// </summary> private void ExecuteWorkItem() { #if !(WindowsCE) CallerThreadContext ctc = null; if (null != _callerContext) { ctc = CallerThreadContext.Capture(_callerContext.CapturedCallContext, _callerContext.CapturedHttpContext); CallerThreadContext.Apply(_callerContext); } #endif Exception exception = null; object result = null; try { try { result = _callback(_state); } catch (Exception e) { // Save the exception so we can rethrow it later exception = e; } // Remove the value of the execution thread, so it will not be possible to cancel the work item // since it is already completed. // Cancelling a work item that already completed may cause the abortion of the next work item!!! Thread executionThread = Interlocked.CompareExchange(ref _executingThread, null, _executingThread); if (null == executionThread) { // Oops! we are going to be aborted..., Wait here so we can catch the ThreadAbortException Thread.Sleep(60 * 1000); // If after 1 minute this thread was not aborted then let it continue working. } } // We must treat the ThreadAbortException or else it will be stored in the exception variable catch (ThreadAbortException tae) { // Check if the work item was cancelled if ((string)tae.ExceptionState == "Cancel") { #if !(WindowsCE) Thread.ResetAbort(); #endif } } #if !(WindowsCE) if (null != _callerContext) { CallerThreadContext.Apply(ctc); } #endif if (!SmartThreadPool.IsWorkItemCanceled) { SetResult(result, exception); } }
// Token: 0x060017A6 RID: 6054 // RVA: 0x00073934 File Offset: 0x00071B34 public static CallerThreadContext Capture(bool bool_0, bool bool_1) { CallerThreadContext callerThreadContext = new CallerThreadContext(); if (bool_0 && CallerThreadContext.getLogicalCallContextMethodInfo != null) { callerThreadContext._callContext = (LogicalCallContext)CallerThreadContext.getLogicalCallContextMethodInfo.Invoke(Thread.CurrentThread, null); if (callerThreadContext._callContext != null) { callerThreadContext._callContext = (LogicalCallContext)callerThreadContext._callContext.Clone(); } } if (bool_1 && HttpContext.Current != null) { callerThreadContext._httpContext = HttpContext.Current; } return callerThreadContext; }