¿Se garantiza que Task.Factory.StartNew () use otro hilo que el que llama?

Estoy iniciando una nueva tarea desde una función, pero no quisiera que se ejecute en el mismo hilo. No me importa en qué hilo se ejecute siempre que sea diferente (por lo que la información proporcionada enesta pregunta no ayuda).

¿Tengo garantizado que el código de abajo siempre saldrá?TestLock antes de permitirTask t para entrar de nuevo? Si no es así, ¿cuál es el patrón de diseño recomendado para evitar la reentrada?

object TestLock = new object();

public void Test(bool stop = false) {
    Task t;
    lock (this.TestLock) {
        if (stop) return;
        t = Task.Factory.StartNew(() => { this.Test(stop: true); });
    }
    t.Wait();
}

Editar: De acuerdo con la respuesta a continuación de Jon Skeet y Stephen Toub, una forma sencilla de evitar de manera determinista la reentrada sería aprobar un CancelToken, como se ilustra en este método de extensión:

public static Task StartNewOnDifferentThread(this TaskFactory taskFactory, Action action) 
 {
    return taskFactory.StartNew(action: action, cancellationToken: new CancellationToken());
}

Respuestas a la pregunta(4)

Su respuesta a la pregunta