É Task.Factory.StartNew () garantido para usar outro segmento que o segmento de chamada?
Eu estou começando uma nova tarefa de uma função, mas eu não quero que ele seja executado no mesmo segmento. Eu não ligo para qual encadeamento ele é executado, desde que seja diferente (então a informação dada emessa questão não ajuda).
Tenho certeza de que o código abaixo sempre sairáTestLock
antes de permitirTask t
para entrar de novo? Caso contrário, qual é o padrão de design recomendado para evitar a 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: Com base na resposta abaixo por Jon Skeet e Stephen Toub, uma maneira simples de impedir determinadamente a reentrada seria passar um CancellationToken, como ilustrado neste método de extensão:
public static Task StartNewOnDifferentThread(this TaskFactory taskFactory, Action action)
{
return taskFactory.StartNew(action: action, cancellationToken: new CancellationToken());
}