2009-10-11 5 views
4

Je ne vois pas de moyen de voir quelles tâches sont en cours d'exécution. Il existe la propriété Task.Current, mais que se passe-t-il si plusieurs tâches sont en cours d'exécution? Y a-t-il un moyen d'obtenir ce genre d'information?Est-il possible de dire quelles tâches sont en cours d'exécution dans la bibliothèque parallèle de tâches?

Alternativement, existe-t-il un moyen intégré d'être averti quand une tâche commence ou se termine?

+0

Avez-vous besoin d'obtenir un programme, ou est-ce pour le débogage? Si c'est pour le débogage, êtes-vous conscient des nouvelles vues de débogage disponibles pour les tâches? –

+0

Je voudrais l'obtenir par programme. J'ai vu les nouvelles vues de débogage et ce sont de bonnes choses, mais pas ce dont j'ai besoin dans ce cas. –

Répondre

3

Hey Mike, il n'y a aucun moyen public d'accéder à la liste des tâches en attente dans TPL. Le mécanisme qui le rend disponible pour le débogueur repose sur le fait que tous les threads seront gelés au moment de l'énumération, par conséquent il ne peut pas être utilisé au moment de l'exécution.

Oui, il existe un moyen intégré d'être averti lorsqu'une tâche est terminée. Consultez les API Task.ContinueWith. Fondamentalement, cette API crée une nouvelle tâche qui se déclenchera lorsque la tâche cible sera terminée.

Je suppose que vous voulez faire un rapport de comptabilité/progression rapide basé sur ceci, si c'est le cas, je vous recommande d'appeler task.ContinueWith() avec l'indicateur TaskContinuationOptions.ExecuteSynchronously. Lorsque vous spécifiez que l'action de continuation sera exécutée sur le même thread à la fin de la tâche cible (si vous ne le spécifiez pas, la tâche de continuation est mise en file d'attente comme toute autre tâche régulière).

Espérons que cela aide.

Huseyin

2

Vous pouvez créer une classe dérivant TaskScheduler de celui fourni. Dans cette classe, vous avez un contrôle total et pouvez ajouter la journalisation de chaque côté de l'exécution. Voir par exemple: http://msdn.microsoft.com/en-us/library/ee789351.aspx

Vous devrez également utiliser un Taskfactory avec une instance de votre classe en tant que planificateur.

3

Vous pouvez également obtenir la tâche en cours d'exécution (ou un parent de la tâche) avec la réflexion:

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(); 
     } 
    } 
}; 
Questions connexes