Comment faire pour déterminer quand la tâche est terminée
voici un exemple de code pour le démarrage de la tâche multiple
Task.Factory.StartNew(() =>
{
//foreach (KeyValuePair<string, string> entry in dicList)
Parallel.ForEach(dicList,
entry =>
{
//create and add the Progress in UI thread
var ucProgress = (Progress)fpPanel.Invoke(createProgress, entry);
//execute ucProgress.Process(); in non-UI thread in parallel.
//the .Process(); must update UI by using *Invoke
ucProgress.Process();
System.Threading.Thread.SpinWait(5000000);
});
});
.ContinueWith(task =>
{
//to handle exceptions use task.Exception member
var progressBar = (ProgressBar)task.AsyncState;
if (!task.IsCancelled)
{
//hide progress bar here and reset pb.Value = 0
}
},
TaskScheduler.FromCurrentSynchronizationContext() //update UI from UI thread
);
quand nous commençons à de multiples tâches à l'aide de Task.Factory.StartNew()
ensuite, nous pouvons utiliser .ContinueWith()
bloc pour déterminer le moment où chaque tâche de finition. je veux dire ContinueWith bloc feu une fois pour chaque réalisation de la tâche. donc, je veux juste savoir est-il un mécanisme de TPL de la bibliothèque. si je commence à 10 tâche à l'aide de Task.Factory.StartNew()
alors, comment dois-je aviser après 10 tâche sera fini. veuillez donner un aperçu des exemples de code.
- Ils doivent être exécutés l'un après l'autre?
OriginalL'auteur Thomas | 2013-06-10
Vous devez vous connecter pour publier un commentaire.
Trois options:
Tâche.WaitAll
appel, qui retourne uniquement lorsque toutes les tâches ont terminéTâche.WhenAll
appel, qui retourne une tâche qui se termine lorsque toutes les tâches ont terminé. (Introduit en .NET 4.5.)TaskFactory.ContinueWhenAll
, ce qui ajoute une continuation de la tâche qui sera exécutée lorsque toutes les tâches ont terminé.TaskFactory.ContinueWhenAll(...)
est pratique aussi, si vous êtes limité à 4.0.Ooh, nice - raté, va l'ajouter.
je travaille dans la version net 4.0. je veux commencer à 10 tâche et je veux être en aviser lors de chaque tâche sera achevé et aussi une dernière notification devrait se faire lorsque 10 tâche sera terminée. merci de me donner une idée. merci
Il semble que vous voulez
ContinueWith
sur chaque tâche, puis un appel àContinueWhenAll
ainsi avec le "tout est accompli" de notification.merci. u peut me donner un indice ou un exemple de code pour l'utilisation de ContinueWhenAll() & ContinueWith() togather.
OriginalL'auteur Jon Skeet
Vous pouvez utiliser De la tâche.WaitAll. Cet appel va bloquer le thread courant jusqu'à ce que toutes les tâches sont terminées.
Note de côté: vous semblez être à l'aide de
Task
,Parallel
etThread.SpinWait
, ce qui rend votre code plus complexe. Je voudrais passer un peu de temps à analyser si cette complexité est vraiment nécessaire.Je voudrais ajouter un
.ContinueWith
pour chaque tâche d'envoyer une notification sur l'achèvement du travail et une dernière ligne seraitTask.WaitAll()
. En d'autres termes, chaque tâche fournit une notification lorsque vous avez terminé en utilisant les tâches de l'enchaînement, où l'enchaînement des tâches simplement des rapports sur l'achèvement. Il y aura aussi un appel à laTask.WaitAll
méthode - ce qui vous permettra de faire une notification à propos de toutes les tâches d'achèvement des travaux. Un sens?OriginalL'auteur oleksii
Vous pouvez utiliser le WaitAll(). Exemple :
Je pense que le “Lancer” commentaire est assez déroutant, car
WaitAll()
n'est pas réellement lancer quoi que ce soit.je travaille dans la version net 4.0. je veux commencer à 10 tâche et je veux être en aviser lors de chaque tâche sera achevé et aussi une dernière notification devrait se faire lorsque 10 tâche sera terminée. merci de me donner une idée. merci
OriginalL'auteur Mez
Une autre solution:
Après l'achèvement de l'ensemble de l'opération à l'intérieur de
Parallel.For(...)
retourner un onject deParallelLoopResult
, La Documentation:La
ParallelLoopResult
classe a unIsCompleted
propriété est définie à false quand unStop()
deBreak()
méthode a été exécuté.Exemple:
Noter qu'il est préférable de l'utiliser uniquement lorsque la rupture ou de stopper la boucle manuellement (sinon il suffit d'utiliser
WaitAll
,WhenAll
etc).OriginalL'auteur Shahar Shokrani