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); }
public static Thread Create(ThreadStart start, ThreadCreationOptions options) { var thread = new Thread(WrapWithParentStackTraceRemoval(start)) { IsBackground = options.IsBackground, Name = options.Name }; var parentThreadStackTrace = ThreadStackTrace.GetCurrentThreadStackTrace(); ThreadStackTrace.RegisterParentThreadStackTrace(thread.ManagedThreadId, parentThreadStackTrace); return(thread); }