Hi Kieren,
Thanks for posting!
NCrunch will re-use processes (and their app domains) whenever it can. Depending on your setup, you'll likely notice NCrunch builds these processes quite often. Basically, NCrunch will spawn a new test process when it needs to run a test task and no other test process is available that can be safely used for the task.
Higher concurrently/parallelisation will require more test processes to exist at any one time. This means that if you have a 'max number of processing threads' set to 3, then NCrunch will need to create 3 test processes to support the execution.
If the codebase is changed, NCrunch must throw away all initialised test processes as the code loaded by them is now different and cannot be reloaded without discarding the processes entirely.
An important setting for reducing the number of process spawning actions is the
max test runners to pool setting. When NCrunch isn't using a test process, it will place it in a pool in case it's needed later. If you have a solution with multiple test projects and NCrunch is constantly shuffling the tests in these projects around the queue, its execution sequence can cause it to lean heavily on the process pool. The default value of 1 in this setting can be inadequate in such a situation, and it may be wise to increase it to at least 3, or even 5.