Question

Question

Ceci est probablement simple que je l'ai raté.

Soit de dire que je ne le (en loveley VB):

Dim t1 As New Task(Sub() Debug.WriteLine("t1"))
Dim t2 As Task = t1.ContinueWith(Sub() Debug.WriteLine("t2"))
Dim t3 As Task = t1.ContinueWith(Sub() Debug.WriteLine("t3"))
t1.Start()

Avis t1.ContinueWith est utilisé deux fois. Quel est l'ordre d'exécution préféré pour ces tâches? Pour moi, il est aléatoire ou mal.

Pourquoi?

La raison pour laquelle je veux faire ...

  1. Créer une tâche saisissant et les données de retour
  2. Suivi par une tâche qui "trie" sur l'interface utilisateur TaskScheduler.FromCurrentSynchronizationContext() (fil UI)
  3. Suivez les données originales accaparement des tâches en convertissant les données en un long rapport (prend âges)
  4. Retour sur le thread d'interface utilisateur, attribuer ce rapport à un contrôle de la prévisualisation
  5. Nettoyage (se débarrasser de mon animation de progression, etc.)

Ceci est rendu plus compliqué par le fait que l'étape 4 est option .

Au milieu de tout cela, mes tâches se plient en arrière aux propriétés membres ensemble afin de l'interface utilisateur et les tâches peuvent jouer bien. Peut-être que je devrais abandonner le résultat et la tâche tout à fait juste coller à Synclocking mes variables membres. Ils sont tous n'attribués qu'une seule fois après tout.

Merci, Tom

Était-ce utile?

La solution

Les tâches sont exécutées dans un ordre LIFO pour une meilleure localisation de mémoire. Cela peut être changé bien sûr, si vous utilisez un programmateur ou si MS differnt décide de « réparer » l'original. Je ne pense pas que vous devez compter sur ce comportement. Au lieu de cela, vous pouvez Déroulez votre tâche de continuer à travailler sur la tâche précédente quand il a terminé. Sinon, vous êtes en attente sur la mauvaise chose. Plus d'infos peuvent être trouvés ici: http://msdn.microsoft.com/en- nous / bibliothèque / ee795275.aspx

Autres conseils

Si vous souhaitez appliquer l'ordre entre t2 et t3, pourquoi ne pas simplement le changement est donc que t3 continue de t2 au lieu de t1?

Dim t1 As New Task(Sub() Debug.WriteLine("t1"))
Dim t2 As Task = t1.ContinueWith(Sub() Debug.WriteLine("t2"))
Dim t3 As Task = t2.ContinueWith(Sub() Debug.WriteLine("t3"))
t1.Start()

Si t2 et t3 étaient en cours d'exécution de temps ils seront exécutés en parallèle comme vous l'aviez écrit.

Il n'y a pas besoin de créer un planificateur de tâches personnalisé pour modifier ce comportement.

Sur la base de vos commentaires sur la réponse de Ian Mercer Je suggère quelque chose comme

Task t1 = new Task((_)=>Console.WriteLine("t1"));
Task tn = secondTaskCondition ? t1.ContinueWith((_)=>Console.WriteLine("t2")) : t1;
Task t3 = tn.ContinueWith((_)=>Console.WriteLine("t3"));
t1.Start();

Cela vous donne l'exécution déterministe et permet encore de composer votre flux de travail avec des unités en option.

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