4 votes

Comment écrire une méthode qui peut gérer Task et ValueTask ?

Imaginez que vous voulez écrire une méthode similaire à celle-ci. Elle enveloppe une fonction renvoyant une ValueTask avec un code de surveillance de performances trivial :

static async Task Measure(Func> body)
{
    Console.WriteLine($"Démarrage du test de performances");
    var sw = Stopwatch.StartNew();
    await body();
    sw.Stop();
    Console.WriteLine(sw.Elapsed);
}

Ma question est : est-il possible d'écrire cette fonction une seule fois de manière à ce qu'elle puisse recevoir à la fois Func> et Func> ?

Vous pourriez bien sûr simplement dupliquer le code et changer uniquement le type du paramètre.

static async Task Measure(Func> body) { ... }

L'implémentation serait absolument identique. Je me demande s'il est possible d'éviter ce genre de duplication de code lorsqu'il faut gérer ValueTask et Task. Jusqu'à présent, je n'ai pas réussi à trouver une bonne solution. Des idées ?

4voto

Sir Rufo Points 7680

Selon la documentation officielle : Types de retour asynchrones généralisés

La structure ValueTask possède un constructeur avec un paramètre Task afin que vous puissiez construire un ValueTask à partir de la valeur de retour de n'importe quelle méthode asynchrone existante :

Cela signifie que vous pouvez écrire une surcharge qui enveloppera le corps et appeler une seule méthode qui fera le travail

static Task Measure(Func> body)
{
    var enveloppé = () => new ValueTask( body() );
    return Mesure( enveloppé );
}

static async Task Measure(Func> body)
{
    Console.WriteLine($"Démarrage du test de performance");
    var sw = Stopwatch.StartNew();
    await body();
    sw.Stop();
    Console.WriteLine(sw.Elapsed);
}

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