Certos System.Threading.Tasks.Task
construtores aceitam a CancellationToken
como parâmetro:
CancellationTokenSource source = new CancellationTokenSource();
Task t = new Task (/* method */, source.Token);
O que me deixa desconcertado é que não há como, dentro do corpo do método, obter o token passado (por exemplo, nada parecido Task.CurrentTask.CancellationToken
). O token deve ser fornecido através de algum outro mecanismo, como o objeto state ou capturado em uma lambda.
Então, qual é a finalidade do fornecimento do token de cancelamento no construtor?
Parallel.For
ouParallel.ForEach
O construtor usa o token para tratamento de cancelamento internamente. Se o seu código deseja acessar o token, você é responsável por transmiti-lo a si mesmo. Eu recomendo a leitura do livro Programação Paralela com Microsoft .NET no CodePlex .
Exemplo de uso do CTS do livro:
fonte
token.ThrowIfCancellationRequested();
? No meu teste, o comportamento é o mesmo. Alguma ideia?when cts.Cancel() is called the Task is going to get canceled and end, no matter what you do
não. Se a tarefa for cancelada antes de ser iniciada, será cancelada . Se o corpo da tarefa simplesmente nunca verificar nenhum token, ele será executado até a conclusão, resultando em um status RanToCompletion . Se o corpo lançar umOperationCancelledException
, por exemplo, byThrowIfCancellationRequested
, a Task verificará se o CancelamentoToken da exceção é igual ao associado à tarefa. Se for, a tarefa é cancelada . Caso contrário, está com falha .O cancelamento não é um caso simples, como muitos podem pensar. Algumas das sutilezas são explicadas nesta postagem do blog no msdn:
Por exemplo:
Cancelamento em extensões paralelas
fonte
Aqui está um exemplo que demonstra os dois pontos na resposta de Max Galkin :
Resultado:
fonte