En C # et TPL ( Task Parallel Library ), la Task
classe représente un travail en cours qui produit une valeur de type T.
J'aimerais savoir quel est le besoin de la méthode Task.FromResult ?
Autrement dit: dans un scénario où vous avez déjà la valeur produite sous la main, quel est le besoin de la réintégrer dans une tâche?
La seule chose qui me vient à l'esprit est qu'il est utilisé comme adaptateur pour d'autres méthodes acceptant une instance de Task.
c#
.net
task-parallel-library
task
async-await
acide lysergique
la source
la source
Réponses:
J'ai trouvé deux cas d'utilisation courants:
la source
Task.FromResult
et un client qui attend de manière asynchrone les E / S réseau. De cette façon, vous pouvez partager la même interface entre client / serveur en utilisantChannelFactory
.IEnumerable<T>
dériver deIDisposable
- cela permet à l'énumérable d'avoir des ressources jetables, pas de le forcer à le faire. NiFromResult
,async
niawait
ne générera de threads.Task
méthode de retour signifie " peut être asynchrone". Ainsi, parfois, les méthodes reçoivent une signature asynchrone sachant très bien que certaines implémentations seront synchrones (par exemple,NetworkStream
devraient être asynchrones, maisMemoryStream
devraient être synchronisées).Un exemple serait une méthode qui utilise un cache. Si le résultat est déjà calculé, vous pouvez renvoyer une tâche terminée avec la valeur (en utilisant
Task.FromResult
). Si ce n'est pas le cas, continuez et retournez une tâche représentant un travail en cours.Exemple de cache: exemple de cache utilisant Task.FromResult pour les valeurs pré-calculées
la source
Task.FromResult
, peuvent être mises en cache.Task.FromResult(0)
,Task.FromResult(1)
,Task.FromResult(false)
etTask.FromResult(true)
sont mises en cache. Vous n'êtes pas censé mettre en cache une tâche pour un accès réseau, mais une tâche à partir du résultat convient parfaitement. Préférez-vous en créer un chaque fois que vous devez renvoyer la valeur?Utilisez-le lorsque vous souhaitez créer une méthode en attente sans utiliser le mot clé async. J'ai trouvé cet exemple:
Ici, vous créez votre propre implémentation de l'interface IHttpActionResult à utiliser dans une action Web Api. La méthode ExecuteAsync est censée être asynchrone, mais vous n'avez pas besoin d'utiliser le mot clé async pour la rendre asynchrone et attendue. Puisque vous avez déjà le résultat et que vous n'avez rien à attendre, il est préférable d'utiliser Task.FromResult.
la source
Depuis MSDN:
http://msdn.microsoft.com/en-us/library/hh228607.aspx
la source
Utilisez le Task.FromResult lorsque vous souhaitez avoir une opération asynchrone mais que parfois le résultat est en cours de manière synchrone. Vous pouvez trouver un bon exemple ici http://msdn.microsoft.com/en-us/library/hh228607.aspx .
la source
Task.FromResult
est utilisé pour obtenir un résultat asynchrone précédemment mis en cache.Je dirais que vous pouvez utiliser Task.FromResult pour des méthodes synchrones qui prennent beaucoup de temps à se terminer alors que vous pouvez effectuer d'autres travaux indépendants dans votre code. Id plutôt faire ces méthodes pour appeler async. Mais imaginez la situation où vous n'avez aucun contrôle sur le code appelé et que vous voulez ce traitement parallèle implicite.
la source