Async Tâche.WhenAll avec délai d'attente
Est-il un moyen dans le nouveau async dotnet 4.5 bibliothèque de définir un délai d'attente sur la Task.WhenAll
méthode. Je veux récupérer plusieurs sources et d'arrêter après 5 secondes et passez les sources qui n'étaient pas finis.
Vous devez vous connecter pour publier un commentaire.
Vous pourriez combiner l'résultant
Task
avec unTask.Delay()
à l'aide deTask.WhenAny()
:Si vous souhaitez récolter les tâches accomplies dans le cas d'un délai d'attente:
Je pense une meilleure, option plus robuste que aussi n'gestion des exceptions droit serait d'utiliser
Tâche.WhenAny
sur chaque tâche en collaboration avec un délai d'attente de tâche, passer par toutes les tâches et filtrer le délai d'attente etawait Task.WhenAll()
au lieu deTask.Result
de rassembler tous les résultats.Voici une complète solution de travail:
Task.WhenAll
est effectuée sur des tâches de retour tâches réalisées (c'est à dire les résultats deTask.WhenAny
s). Puis-je filtrer ces tâches avec une clause where. Enfin je utiliserTask.WhenAll
sur ces tâches pour extraire leurs résultats réels. Toutes ces tâches doivent déjà être complétée à ce point.Découvrez le "Début de Sauvetage" et "Tâche.Retard" sections à partir de Microsoft Basée Sur Les Tâches Asynchrones Vue D'Ensemble Du Modèle.
En plus de délai d'attente, j'ai aussi vérifier l'annulation qui est utile si vous créez une application web.
Ce que vous décrivez semble être un très commun de la demande cependant je ne pouvais pas trouver n'importe où, un exemple de cela. Et j'ai beaucoup cherché... j'ai finalement créé le suivant:
Je suppose ici une méthode SomeTaskAsync que revient la Tâche de<MyResult>.
De la part des membres de completedTasks, seules les tâches de type MyResult sont nos propres tâches qui ont réussi à battre l'horloge. De la tâche.Retard retourne un type différent.
Cela nécessite de faire des compromis sur le typage, mais tout fonctionne à merveille et très simple.
(Le tableau peut bien sûr être construit de manière dynamique à l'aide d'une requête + ToArray).
nulle résultat de la version de @i3arnon 's réponse, ainsi que les commentaires et de modifier la première argument pour utiliser cette extension.
J'ai aussi un transfert de la méthode de spécification de délai comme un int à l'aide de
TimeSpan.FromMilliseconds(millisecondsTimeout)
pour correspondre à d'autres la Tâche de méthodes.Je suis venu à la suite de morceau de code qui fait ce que j'avais besoin:
Mon explication est dans mon article sur le blog:
http://blog.bekijkhet.com/2012/03/c-async-examples-whenall-whenany.html
Découvrez une tâche personnalisée combinator proposé dans http://tutorials.csharp-online.net/Task_Combinators
Je n'ai pas encore essayé.
En plus de svick réponse, les ouvrages suivants, pour moi, quand je dois attendre pour un couple de tâches à accomplir, mais ont à traiter quelque chose d'autre pendant que je suis en attente:
Vous pouvez utiliser le code suivant:
Comment cela fonctionne:
Vous avez besoin de mettre dans le timeoutTime variable de la limite de temps pour toutes les tâches à accomplir. Donc, fondamentalement, toutes les tâches d'attendre au maximum le temps que vous définissez dans timeoutTime. Lorsque toutes les tâches de retourner le résultat, le délai d'attente n'aura pas lieu et le tasksResult sera fixé.
Après cela nous sommes seulement obtenir l'tâches terminées. Les tâches qui n'ont pas été effectués aura pas de résultats.
Semble que la Tâche.WaitAll de surcharge avec le paramètre de délai d'attente est tout ce dont vous avez besoin - si elle retourne true, alors, vous savez, ils ont tous terminé - dans le cas contraire, vous pouvez filtrer sur IsCompleted.
Task.WaitAll()
est le blocage, il n'est donc pas une bonne idée de l'utiliser en C# 5, si vous pouvez l'éviter.Task
s ouasync
méthodes n'est pas aussi simple que cela. Deuxièmement, pourquoi cette question?