Chaîne de tâches (attendre que la tâche précédente soit terminée)
var tasks = new List<Task>();
foreach (var guid in guids)
{
var task = new Task( ...);
tasks.Add(task);
}
foreach (var task in tasks)
{
task.Start();
Task.WaitAll(task);
}
Ce qui est de l'exécution du thread d'INTERFACE utilisateur. J'ai besoin d'exécuter toutes les tâches en tâches variable l'une après l'autre. Le problème est que si je l'appelle de la Tâche.WaitAll(tâche), l'INTERFACE de gel. Comment puis-je faire la logique suivante sans avoir l'INTERFACE utilisateur de gel?
source d'informationauteur Melursus
Vous devez vous connecter pour publier un commentaire.
Ce n'est pas la Tâche de Chaînage.
Vous avez besoin de faire Tâche de chaînage à l'aide de
ContinueWith
. Dernière tâche aurait besoin de mettre à jour l'INTERFACE utilisateur.Note que la dernière ligne a
TaskScheduler.FromCurrentSynchronizationContext()
cela permettra d'assurer tâche sera exécutée dans le contexte de synchronisation (Thread d'INTERFACE utilisateur).Le meilleur moyen est d'utiliser le Task Parallel Library (TPL) et Continuations. Une suite permet non seulement de créer un flux de tâches, mais également de poignées de vos exceptions. C'est un excellente introduction à la TPL. Mais pour vous donner une idée...
Vous pouvez démarrer une tâche TPL à l'aide de
Maintenant pour démarrer une deuxième tâche quand un antécédent d'une tâche terminée (dans l'erreur ou de la réussite), vous pouvez utiliser le
ContinueWith
méthodeDonc dès que
task1
terminée, échoue ou est annulétask2
"feux" et commence à courir. Notez que sitask1
avait terminé avant d'atteindre la deuxième ligne de codetask2
serait programmée pour exécuter immédiatement. LeantTask
argument passé à la deuxième lambda est une référence à la tâche précédente. Voir ce lien pour des exemples plus détaillés...Vous pouvez également passer des continuations les résultats de la tâche précédente
Note. Assurez-vous de lire sur la gestion des exceptions dans le premier lien, car cela peut conduire à un nouveau venu à la TPL égarer.
Une dernière chose à regarder en particulier pour ce que vous voulez, c'est l'enfant des tâches. Enfant tâches sont ceux qui sont créés en tant que
AttachedToParent
. Dans ce cas, la poursuite ne fonctionnera pas jusqu'à ce que toutes les tâches enfants ont terminéJ'espère que cette aide.
Vous devez utiliser continutations: