Dev (Back & Front)ARTIGO

C# 7.0: utilizando a classe ValueTask

Neste artigo, o autor ensina a usar a classe ValueTask no C# 7.0.

O uso do tipo genérico Task<T> (namespace System.Threading.Tasks) em método assíncronos, implica invariavelmente, na alocação de recursos para a devolução de um objeto ou valor.

E se a instância a ser retornada já existir no momento em que a operação assíncrona é invocada? Ainda assim, ocorrerá a alocação de memória por conta do uso de Task<T>.

No C# 7.0, foi disponibilizada a classe ValueTask (namespace System.Threading.Tasks) como uma forma de superar essa limitação, evitando alocações desnecessárias e levando a ganhos de performance. É o que demonstra o exemplo a seguir, no qual se observa a presença do método assíncrono EsperaAleatória:

  • Um valor inteiro será calculado num primeiro momento, associado ao atributo privado _tempoEsperaInicial e utilizado para um intervalo de espera (via operação Delay da classe Task);
  • Execuções posteriores farão com que apenas se devolva o resultado vinculado previamente a _tempoEsperaInicial.
using System;
using System.Threading.Tasks;
 
namespace ExemploValueTask
{
    class Program
    {
        private static int _tempoEsperaInicial;
 
        private static async ValueTask<int> EsperaAleatoria()
        {
            if (_tempoEsperaInicial == 0)
            {
                _tempoEsperaInicial = new Random().Next(5000, 10000);
                await Task.Delay(_tempoEsperaInicial);
            }
 
            return _tempoEsperaInicial;
        }
 
        static void Main(string[] args)
        {
            Console.WriteLine("Criando a primeira task");
            var task1 = EsperaAleatoria();
            Console.WriteLine("Retorno da primeira task: " + task1.Result);
 
            Console.WriteLine("Criando a segunda task");
            var task2 = EsperaAleatoria();
            Console.WriteLine("Retorno da segunda task: " + task2.Result);
 
            Console.ReadKey();
        }
    }
}

A execução desse conjunto de instruções produzirá um resultado similar ao seguinte conteúdo:

Referências

Atua como consultor em atividades voltadas ao desenvolvimento de sistemas há mais de 15 anos. Microsoft MVP (Most Valuable Professional) e participante do programa MTAC (Multi-Plataform Technical Audience Contributor). Bacharel em Sistemas de Informação, com Especialização em Engenharia de Software e MBA em Business Intelligence. Também é palestrante e autor técnico em portais e revistas especializadas, com foco em tecnologias Microsoft e boas práticas na área de software.

Ver perfil