Existe uma maneira de saber quais tarefas estão sendo executadas atualmente na Biblioteca Paralela de tarefas?

StackOverflow https://stackoverflow.com/questions/1551537

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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top