public void Execute <TState>(Action <TState> action, TState actionState) where TState : new() { void ActionWrapper(TaskExecutionState <TState> scopedTaskState) { var currentThreadId = Thread.CurrentThread.ManagedThreadId; var canRegisterParentStacktrace = currentThreadId != scopedTaskState.ParentThreadId; try { if (canRegisterParentStacktrace) { ThreadStackTrace.RegisterParentThreadStackTrace(currentThreadId, scopedTaskState.ThreadStackTrace); } action(scopedTaskState.ActionState); } finally { if (canRegisterParentStacktrace) { ThreadStackTrace.UnregisterParentThreadStackTrace(currentThreadId); } } } this._cts.Token.ThrowIfCancellationRequested(); var stackedStackTrace = ThreadStackTrace.GetCurrentThreadStackTrace(); var taskState = new TaskExecutionState <TState>(actionState, Thread.CurrentThread.ManagedThreadId, stackedStackTrace, this._cts.Token); this._taskFactory.StartNew(ActionWrapper, taskState, this._taskFactory.CreationOptions); }
private static ThreadStart WrapWithParentStackTraceRemoval(ThreadStart start) { void Wrapper() { try { start(); } finally { ThreadStackTrace.UnregisterParentThreadStackTrace(Thread.CurrentThread.ManagedThreadId); } } return(Wrapper); }