示例#1
0
        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);
        }
示例#2
0
        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);
        }