Est-il possible de dire quelles tâches en cours d'exécution dans la bibliothèque parallèle de tâches?

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

Question

Je ne vois pas une façon de voir quelles tâches sont en cours d'exécution. Il est la propriété Task.Current, mais s'il y a plusieurs tâches en cours d'exécution? Y at-il un moyen d'obtenir ce genre d'information?

Alternativement, il est construit de façon à être averti quand une tâche commence ou complète?

Était-ce utile?

La solution

Hey Mike, il n'y a pas d'accès à la voie publique 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 sujets seront gelés au moment de l'énumération, donc il ne peut pas être utilisé lors de l'exécution.

Oui, il y a construit de façon à être averti Whan une tâche complète. Consultez les API Task.ContinueWith. Fondamentalement, cette API crée une nouvelle tâche qui pète lorsque la tâche cible est terminée.

Je suppose que vous voulez faire un peu de comptabilité rapide / les rapports d'étape sur cette base, si tel est le cas, je vous recommande que vous appelez task.ContinueWith () avec le drapeau TaskContinuationOptions.ExecuteSynchronously. Lorsque vous spécifiez que l'action de poursuite sera exécuté là sur le même fil lorsque la tâche cible se termine (si vous ne spécifiez pas la tâche de continuation est mis en attente jusqu'à comme toute autre tâche régulière).

Hope this helps.

Huseyin

Autres conseils

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

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

Vous pouvez créer une classe TaskScheduler provenant de celui fourni. Au sein de cette classe, vous avez le plein contrôle et peut ajouter la connexion de chaque côté de l'exécution. Voir par exemple: http://msdn.microsoft.com/en-us/ bibliothèque / ee789351.aspx

Vous aurez également besoin d'utiliser un Taskfactory avec une instance de votre classe comme le planificateur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top