Exemple de tâche en C#
Je suis en train de créer à l'aide de Tâches en C#.
Je suis en train d'exécuter ce code.
private static void CreateSubtask() {
Task<Int32[]> parent = Task.Run(() =>
{
var results = new Int32[3];
new Task(() => results[0] = 0,
TaskCreationOptions.AttachedToParent).Start();
new Task(() => results[1] = 1,
TaskCreationOptions.AttachedToParent).Start();
new Task(() => results[2] = 2,
TaskCreationOptions.AttachedToParent).Start();
return results;
});
var finalTask = parent.ContinueWith(
parentTask =>
{
foreach (int i in parentTask.Result)
Console.WriteLine(i);
});
finalTask.Wait();
}
La finalTask ne fonctionne que si le parent Tâche est terminée, et le parent Tâche se termine lorsque toutes les trois enfants sont finis. Vous pouvez l'utiliser pour créer assez complexe la Tâche des hiérarchies qui va passer par toutes les étapes que vous avez spécifié.
Ce que j'ai obtenu à partir de l'exécution à la place est de trois lignes en disant:
0
0
0
Je m'attendais à être
0
1
2
Suis-je droit?
- Je ne suis pas familier avec la Task Parallel Library, mais je suppose que les trois tâches que vous créez dans votre tâche
parent
n'ayant pas encore au moment de la lecture d'parent
s'entraîner. Il semble que vous attendez pourparent
à la fin, mais pas pour les trois tâches créées insindeparent
. - double possible de TaskCreationOptions.AttachedToParent n'est pas d'attente pour tâche enfant
- J'ai couru votre code et j'obtiens 0 1 2 qui est ce que je m'attends
Vous devez vous connecter pour publier un commentaire.
À l'aide de
Task.Run
avec le parent tâche supprime l'effet deAttachedToParent
sur teh enfant de la tâche: http://blogs.msdn.com/b/pfxteam/archive/2011/10/24/10229468.aspxUtilisation
Task.Factory.StartNew
à la place.Le problème, c'est que votre
parent
fin de la tâche quand il finit de départ les trois autres tâches, pas quand les trois autres tâches sont fini.Au lieu de cela, vous pouvez utiliser
Task.WhenAll
de créer une tâche qui ne sera achevée que lorsque toutes les autres tâches qui sont eux-mêmes remplis.Un autre changement pour rendre votre programme plus idiomatiques code de tâche de chaque intérieur tâche le retour de leur propre valeur, plutôt que de la mutation de certains partagée de l'état, tout simplement parce que de traiter avec un état partagé peut être plus difficile à raisonner dans un environnement multithread.
Vous êtes seulement à partir de vos trois sous-tâches, mais ne pas attendre pour eux à la fin. L'adapter comme ceci, par exemple:
Notez également qu'avec votre code actuel, il est encore possible de montrer
0 1 2
(pas1 2 3
par la voie), comme il n'est pas déterminée lorsque les sous-tâches sont en cours d'exécution et de finition. Cela peut aussi dépendre de votre configuration de build (debug /release).AttachedToParent
fait normalement la mère d'attente pour ses enfants. La question est, pourquoi n'est-il pas ici?