Czy Task.Factory.StartNew () gwarantuje użycie innego wątku niż wątek wywołujący?

Rozpoczynam nowe zadanie od funkcji, ale nie chciałbym, aby działało w tym samym wątku. Nie obchodzi mnie, który wątek działa tak długo, jak długo jest inny (więc informacje podane wto pytanie nie pomaga).

Czy mam gwarancję, że poniższy kod zawsze się zakończyTestLock przed zezwoleniemTask t wejść ponownie? Jeśli nie, jaki jest zalecany wzór, aby zapobiec ponownemu wejściu na rynek?

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();
}

Edytować: Na podstawie poniższej odpowiedzi Jona Skeeta i Stephena Touba, prostym sposobem na deterministyczne zapobieganie reentrancy byłoby przekazanie tokenu CancellationToken, jak pokazano w tej metodzie rozszerzenia:

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

questionAnswers(4)

yourAnswerToTheQuestion