/// <summary> /// Execute the work item /// </summary> private void ExecuteWorkItem() { CallerThreadContext callerThreadContext = null; if (this._callerContext != null) { callerThreadContext = CallerThreadContext.Capture(this._callerContext.CapturedCallContext, this._callerContext.CapturedHttpContext); CallerThreadContext.Apply(this._callerContext); } Exception exception = null; object result = null; try { result = this._callback(this._state); } catch (Exception exception2) { exception = exception2; } if (this._callerContext != null) { CallerThreadContext.Apply(callerThreadContext); } this.SetResult(result, exception); }
/// <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> /// Execute the work item /// </summary> private void ExecuteWorkItem() { #if !(_WINDOWS_CE) && !(_SILVERLIGHT) && !(WINDOWS_PHONE) 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 #if SSHARP catch (Exception tae) #else catch (ThreadAbortException tae) #endif { #if SSHARP if (!(tae is System.Threading.ThreadAbortException)) { throw; } #endif 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) { #if !(_WINDOWS_CE) && !(_SILVERLIGHT) && !(WINDOWS_PHONE) Thread.ResetAbort(); #endif } } #if !(_WINDOWS_CE) && !(_SILVERLIGHT) && !(WINDOWS_PHONE) if (null != _callerContext) { CallerThreadContext.Apply(ctc); } #endif if (!SmartThreadPool.IsWorkItemCanceled) { SetResult(result, exception); } }