En C # et TPL ( Bibliothèque de tâches parallèle ), la classe Task
représente un travail en cours produisant une valeur de type T.
J'aimerais savoir quelle est la nécessité de la méthode Task.FromResult ?
C'est-à-dire: dans un scénario où vous avez déjà la valeur produite sous la main, quelle est la nécessité de la replacer dans une tâche?
La seule chose qui me vienne à l’esprit est qu’il est utilisé comme un adaptateur pour d’autres méthodes acceptant une instance de tâche.
J'ai trouvé deux cas d'utilisation courants:
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, vous pouvez alors retourner une tâche représentant le travail en cours.
Exemple de cache: Exemple de cache utilisant Task.FromResult pour des valeurs pré-calculées
Utilisez-le lorsque vous souhaitez créer une méthode attendue sans utiliser le mot clé async. J'ai trouvé cet exemple:
public class TextResult : IHttpActionResult
{
string _value;
HttpRequestMessage _request;
public TextResult(string value, HttpRequestMessage request)
{
_value = value;
_request = request;
}
public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
{
var response = new HttpResponseMessage()
{
Content = new StringContent(_value),
RequestMessage = _request
};
return Task.FromResult(response);
}
}
Vous créez ici votre propre implémentation de l'interface IHttpActionResult à utiliser dans une action Web Api. La méthode ExecuteAsync devrait être asynchrone, mais vous n'avez pas à utiliser le mot clé async pour la rendre asynchrone et attendue. Puisque vous avez déjà le résultat et n'avez rien à attendre, il est préférable d'utiliser Task.FromResult.
De MSDN:
Cette méthode est utile lorsque vous effectuez une opération asynchrone qui renvoie un objet Task et que le résultat de cet objet Task est déjà calculé.
Utilisez Task.FromResult lorsque vous souhaitez effectuer une opération asynchrone mais que le résultat est parfois synchrone. Vous pouvez trouver un bon échantillon ici http://msdn.Microsoft.com/en-us/library/hh228607.aspx .
Je dirais que vous pouvez utiliser Task.FromResult pour les méthodes synchrones prenant beaucoup de temps, alors que vous pouvez effectuer un autre travail indépendant dans votre code. Je préférerais que ces méthodes appellent async cependant. Mais imaginons la situation dans laquelle vous n’avez aucun contrôle sur le code appelé et vous souhaitez ce traitement parallèle implicite.