Use TaskCompletionSource to avoid to waste a thread of the thread pool to wait the workers.
Move the custom threads(long running Tasks) to the normal thread pool. The rationale is that we expect usually quick tests like unit tests with a lot of data sets. In that case we save the creation of custom expensive threads and we will have better reuse (long running will create new thread, we see it often in the profilers and we wait the creation of all of those before to start the tests, so for few quick tests we're paying for no reason). If tests are "slow" anyway we will have to wait...so follow the thread pool injection policy that is handling also the blocking(Wait() vs await) api won't make a lot of difference compared to custom threads from timing/performance perspective. On an internal custom adapter implementation based on thread pool we saw better perf. If user wants to override the injection policy he/she can always use inside the assembly init the min thread pool threads custom setting.
TaskCompletionSource
to avoid to waste a thread of the thread pool to wait the workers.