Quem cancelou minha tarefa?
Minha tarefa c # está sendo cancelada, mas não por mim. Eu não consigo um stacktrace e não consigo descobrir onde o problema ocorre.
Minha chamada de tarefa é assim:
var t = Task<Boolean>.Factory.StartNew(() =>
{
Boolean bOk = DoSomthingImportant();
return bOk;
}, TaskCreationOptions.AttachedToParent)
.ContinueWith<Boolean>((theTask) =>
{
var reason = theTask.IsCanceled ? "it was canceled" : "it faulted";
Debug.WriteLine("Error: Task ended because " + reason + ".");
... log the exception to one of my objects...
return false;
}, TaskContinuationOptions.NotOnRanToCompletion);
Eu quero que a tarefa de continuação seja executada se a tarefa tiver falhado ou for cancelada, mas não se correu bem. A continuação nunca é executada.
Posteriormente, meu programa captura uma AggregateException que envolve uma TaskCanceledException.
Minha outra grande interação com minhas tarefas é chamar WaitAny (taskArray, timeout) até que eu não tenha mais tarefas para iniciar, então chame WaitAll sem tempo limite até que a última tarefa seja feita.
Poderia WaitAny com um tempo limite causar um cancelamento? Por que minha continuação não foi chamada?
Este é apenas o meu segundo pincel com a biblioteca de tarefas, por isso estou sem noção.
ATUALIZAR:
Eu encontrei esta pergunta SO: Como propagar o status Cancelado de uma tarefa para uma tarefa de continuação. Um erro no meu código acima (mas não a causa do cancelamento) é que eu assumi que o status das tarefas de continuação era o mesmo que o status da tarefa original. Na verdade, você tem que fazer algum trabalho para obter um do outro, como descreve o outro post.
ATUALIZAÇÃO 2:
Brian: Obrigado pela referência do documentaion. Eu pesquisei alto e baixo por causas alternativas de uma tarefa sendo cancelada, mas perdi estas palavras:
"Se você estiver esperando em uma tarefa que transita para o estado Cancelado, uma tarefa (contida em uma AggregateException) é fabricada e lançada. Observe que essa exceção indica cancelamento bem-sucedido em vez de uma situação com falha. Portanto, a propriedade de exceção da tarefa retorna null. "