Existe uma maneira de saber quais tarefas estão sendo executadas atualmente na Biblioteca Paralela de tarefas?
-
20-09-2019 - |
Pergunta
Não consigo ver uma maneira de ver quais tarefas estão sendo executadas. Existe a propriedade. Existe uma maneira de obter esse tipo de informação?
Como alternativa, existe uma maneira de ser notificada quando uma tarefa é iniciada ou completa?
Solução
Ei Mike, não há maneira pública de acessar a lista de tarefas pendentes na TPL. O mecanismo que o disponibiliza para o depurador conta com o fato de que todos os threads serão congelados no tempo de enumeração; portanto, não pode ser usado em tempo de execução.
Sim, há uma maneira incorporada para ser notificada quando é concluída uma tarefa. Confira a tarefa. Continue com APIs. Basicamente, essa API cria uma nova tarefa que será iniciada quando a tarefa de destino for concluída.
Suponho que você queira fazer alguns relatórios rápidos de contabilidade / progresso com base nisso, se for esse o caso, eu recomendo que você ligue para tarefas.ContinueWith () com a sinalização do TaskContinuationOptions. Quando você especifica que a ação de continuação será executada ali no mesmo thread quando a tarefa de destino terminar (se você não especificar isso, a tarefa de continuação está na fila como qualquer outra tarefa regular).
Espero que isto ajude.
Huseyin
Outras dicas
Você também pode obter a tarefa atualmente em execução (ou os pais de uma tarefa) com reflexão:
static public class Extensions
{
public static Task Parent(this Task t)
{
FieldInfo info = typeof(Task).GetField("m_parent",
BindingFlags.NonPublic | BindingFlags.Instance);
return info != null ? (Task)info.GetValue(t) : null;
}
public static Task Self
{
get
{
return Task.Factory.StartNew(
() => { },
CancellationToken.None,
TaskCreationOptions.AttachedToParent,
TaskScheduler.Default).Parent();
}
}
};
Você pode criar um TaskScheduler
classe derivada do fornecido. Nessa classe, você tem controle total e pode adicionar o log de ambos os lados da execução. Veja, por exemplo: http://msdn.microsoft.com/en-us/library/ee789351.aspx
Você também precisará usar um Taskfactory
com uma instância da sua classe como o agendador.