261 votes

Quel est l'usage de Task.FromResult<TResult> en C#

En C# et TPL (Bibliothèque parallèle de tâches), la classe Task 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 ?

C'est-à-dire : dans un scénario où vous avez déjà la valeur produite en main, quel est le besoin de l'emballer de nouveau dans une Task ?

La seule chose qui me vient à l'esprit est qu'elle est utilisée comme un adaptateur pour d'autres méthodes acceptant une instance de Task.

361voto

Stephen Cleary Points 91731

Il existe deux cas d'utilisation courants que j'ai trouvés :

  1. Lorsque vous implémentez une interface qui autorise des appelants asynchrones, mais que votre implémentation est synchrone.
  2. Lorsque vous simulez un code asynchrone pour les tests.

65voto

Matt Smith Points 6843

Un exemple serait une méthode qui utilise un cache. Si le résultat est déjà calculé, vous pouvez retourner une tâche terminée avec la valeur (en utilisant Task.FromResult). Sinon, vous pouvez retourner une tâche représentant un travail en cours.

Exemple de cache : Exemple de cache utilisant Task.FromResult pour les valeurs précalculées

48voto

Edminsson Points 2181

Utilisez-le lorsque vous souhaitez créer une méthode pouvant être 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 ExecuteAsync(CancellationToken cancellationToken)
    {
        var response = new HttpResponseMessage()
        {
            Content = new StringContent(_value),
            RequestMessage = _request
        };
        return Task.FromResult(response);
    }
}

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 à attendre rien, il est préférable d'utiliser Task.FromResult.

27voto

goughy000 Points 321

À partir de msft.com Créez des tâches précalculées avec Task.FromResult:

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

6voto

Alborz Points 1608

Utilisez la Task.FromResult() lorsque vous voulez avoir une opération asynchrone mais parfois le résultat est en main synchroniquement. Vous pouvez trouver un bon exemple ici: Créer des tâches pré-calculées.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X