Я запускаю новую задачу из функции, но я не хочу, чтобы она запускалась в том же потоке. Мне все равно, какой поток он работает, пока он другой (поэтому информация, приведенная в этом вопросе, не помогает).
Я уверен, что приведенный ниже код всегда выйдет из TestLock
, прежде чем позволить Task t
снова ввести его? Если нет, то каков рекомендуемый шаблон проектирования для предотвращения повторной установки?
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();
}
Изменить:. Основываясь на следующем ответе Джона Скита и Стивена Туба, простой способ детерминистически предотвратить повторное участие - это передать CancellationToken, как показано в этом методе расширения:
public static Task StartNewOnDifferentThread(this TaskFactory taskFactory, Action action)
{
return taskFactory.StartNew(action: action, cancellationToken: new CancellationToken());
}