Créer une Tâche terminée
Je veux créer un formulaire de Task
(pas Task<T>
). Est-il quelque chose de construit en .NET pour cela?
Une question connexe:
Créer une Tâche terminée<T>
It seems like the answer I'm getting from everyone is that using a garbage value like this is the correct way. That there isn't a way to do this without the garbage value is disappointing -- oh well.
Quels problèmes avez-vous pensez que c'est? Si vous cache un seulTask
ensuite l'ensemble de votre programme prend un bit supplémentaire de mémoire. Ce n'est rien. Aussi, on pourrait créer une tâche achevée sans le faire, ça ne serait pas mieux.- Oh ma déception n'a rien à voir avec le fait d'avoir à utiliser de la mémoire supplémentaire. C'est juste que les ordures des valeurs de n'importe où dans le code ne sont pas élégant.
- Notez qu'il y a aujourd'hui
ValueTask
pour les tâches terminées (c'est à dire pour les valeurs que vous avez déjà, de sorte que le code est essentiellement synchrone), qui vous permettra d'économiser une allocation.
Vous devez vous connecter pour publier un commentaire.
La version la plus récente de .Net (v4.6) ajoute juste que, un haut -De la tâche.CompletedTask:
Cette propriété est mise en œuvre comme un non-verrouillage du singleton de sorte que vous vous presque toujours utiliser la même tâche terminée.
Task.CompletedTask
est encore interne.Task<T>
est implicitement convertible pourTask
, si juste obtenir un formulaire deTask<T>
(avec toutT
et n'importe quelle valeur) et l'utiliser. Vous pouvez utiliser quelque chose comme cela pour cacher le fait que le résultat est là, quelque part.De noter que, puisque nous ne sommes pas exposer le résultat, et la tâche est toujours terminée, nous pouvons cache une seule tâche et de le réutiliser.
Si vous êtes en utilisant .NET 4.0 et n'ont pas
FromResult
ensuite, vous pouvez créer votre propre en utilisantTaskCompletionSource
:Ma méthode de prédilection pour ce faire est d'appeler
Task.WhenAll()
sans arguments. Le La documentation MSDN stipule que "Si le tableau fourni/énumérable contient pas de tâches, les tâches seront immédiatement la transition vers un RanToCompletion de l'état avant d'être retourné à l'appelant.". Cela ressemble à ce que vous voulez.Mise à jour: j'ai trouvé la source par rapport à Microsoft est la Source de Référence; là, vous pouvez voir ce que les Tâches.WhenAll contient les éléments suivants:
Donc Tâche.CompletedTask est en effet interne, mais il est exposé en appelant WhenAll() sans arguments.
Je voudrais utiliser
Task.Delay(0)
. En interne, il renvoie une instance mise en cache d'uneTask<T>
. C'est exactement ce que la réponse actuelle suggère de faire de toute façon, mais maintenant, vous n'avez pas à cache une instance vous-même, ni avez-vous de l'inconfort de déchets valeurs dans votre code.Vous pensez peut-être vous pouvez utiliser
Task.Yield()
au lieu de cela, mais il s'avère que le résultat deTask.Yield()
est pas un sous-type deTask
, alors que le résultat deTask.Delay(0)
est. C'est une des différences subtiles entre les deux.Vous pouvez utiliser De la tâche.FromResult (en .NET 4.5) pour retourner un formulaire de
Task<T>
.Si vous avez besoin d'un non-générique
Task
, vous pouvez toujours utiliserTask.FromResult(0)
ou similaire, depuisTask<T>
est une sous-classe deTask
.Pour .Net de 4,6 et au-dessus de l'utilisation
Pour la version la plus basse, vous pouvez utiliser
return Task.Delay(0);
à la place?Vous pouvez utiliser Nito.AsyncEx.TaskConstants.Terminé à partir d'une grande bibliothèque AsyncEx de Stephen Cleary.
Comment sur:
Vous pouvez laisser de côté l'avertissement de suppression si vous n'avez pas l'esprit.
async
encore crée de l'ensemble de la machine d'état de l'appareil, même si vous ne l'utilisez pas, afin de retourner un vide tâche est plus efficace pour les faibles ressources des scénarios.