Description
A lot of the problems we face is based around handling of the pipeline thread. In order to invoke something on it, we need to interact with the PowerShell
class, making us invoke at least a small bit of script in most cases. The reason for this is that the actual thread used by PowerShell is internal to the runspace by default. The only way to access it is to invoke a command of some sort.
This is the default experience, but we can change it. Runspace
has a property called ThreadOptions
. One of the choices for that enum is UseCurrentThread
. So what we can do is start our own thread, create the runspace there with that option, and never give up that thread.
One of the biggest wins here would be that we could call PSConsoleReadLine.ReadLine
directly without having to invoke something. We could also ditch using the thread pool to wait for PowerShell.Invoke
to finish (which probably causes some dead locks). We could get rid of a lot of the more complicated code in PowerShellContext
.
I'm pretty confident that if this doesn't outright solve a lot of the sluggishness and dead locks, it'll at the very least be significantly easier to debug.
The rest of this post is taken from #980 since the idea is the same: Nvm, just look at @rjmholt's code and the rest of conversation. The linked post is pretty outdated.