Гарантируется ли Task.Factory.StartNew () использовать другой поток, а не вызывающий поток?
Я запускаю новую задачу из функции, но не хотел бы, чтобы она выполнялась в том же потоке. Я нене важно, в каком потоке он работает, если он другой (поэтому информация, приведенная вэтот вопрос не помогает).
Я гарантированно, что приведенный ниже код будет всегда выходить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());
}