web-dev-qa-db-fra.com

Quelle est l'utilisation de Task.FromResult <TResult> en C #

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.

160
lysergic-acid

J'ai trouvé deux cas d'utilisation courants:

  1. Lorsque vous implémentez une interface qui autorise les appelants asynchrones, mais que votre implémentation est synchrone.
  2. Lorsque vous modifiez/moquez du code asynchrone à des fins de test.
219
Stephen Cleary

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

45
Matt Smith

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.

25
Edminsson

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é.

http://msdn.Microsoft.com/en-us/library/hh228607.aspx

19
goughy000

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 .

3
Alborz

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.

1
Viking