/// <summary>
        /// Initializes an new instance of the ThreadController class. This constructor should only
        /// ever been called from the thread it is meant to control.
        /// </summary>
        /// <param name="nestFrame">The parent PromptNestFrame object.</param>
        internal ThreadController(PromptNestFrame nestFrame)
        {
            _nestFrame           = nestFrame;
            PipelineRequestQueue = new AsyncQueue <IPipelineExecutionRequest>();
            FrameExitTask        = new TaskCompletionSource <DebuggerResumeAction>();
            ManagedThreadId      = Thread.CurrentThread.ManagedThreadId;

            // If the debugger stop is triggered on a thread with no default runspace we
            // shouldn't attempt to route commands to it.
            IsPipelineThread = Runspace.DefaultRunspace != null;
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="PromptNest" /> class.
        /// </summary>
        /// <param name="powerShellContext">
        /// The <see cref="PowerShellContext" /> to track prompt status for.
        /// </param>
        /// <param name="initialPowerShell">
        /// The <see cref="PowerShell" /> instance for the first frame.
        /// </param>
        /// <param name="consoleReader">
        /// The input handler.
        /// </param>
        /// <param name="versionSpecificOperations">
        /// The <see cref="IVersionSpecificOperations" /> for the calling
        /// <see cref="PowerShellContext" /> instance.
        /// </param>
        /// <remarks>
        /// This constructor should only be called when <see cref="PowerShellContext.CurrentRunspace" />
        /// is set to the initial runspace.
        /// </remarks>
        internal PromptNest(
            PowerShellContext powerShellContext,
            PowerShell initialPowerShell,
            IHostInput consoleReader,
            IVersionSpecificOperations versionSpecificOperations)
        {
            _versionSpecificOperations = versionSpecificOperations;
            _consoleReader             = consoleReader;
            _powerShellContext         = powerShellContext;
            _frameStack = new ConcurrentStack <PromptNestFrame>();
            _frameStack.Push(
                new PromptNestFrame(
                    initialPowerShell,
                    NewHandleQueue()));

            var readLineShell = PowerShell.Create();

            readLineShell.Runspace = powerShellContext.CurrentRunspace.Runspace;
            _readLineFrame         = new PromptNestFrame(
                readLineShell,
                new AsyncQueue <RunspaceHandle>());

            ReleaseRunspaceHandleImpl(isReadLine: true);
        }