Awaiters Personalizados em C#: Controle Avançado de Async

Criar📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!Descubra os fundamentos do REST e boas práticas para criar APIs simples, escaláveis e eficientes. Domine métodos HTTP e status codes com exemplos práticos. Awaiters personalizados pode ser uma maneira poderosa de controlar o fluxo de código assíncronoRefatorando Código Síncrono para Assíncrono: Guia Passo a PassoRefatorando Código Síncrono para Assíncrono: Guia Passo a PassoDescubra como transformar código síncrono em assíncrono em C# com práticas detalhadas, garantindo performance e escalabilidade em suas aplicações. em situações mais específicas. Geralmente, usamos o TaskDiferenças entre Threads, Tasks e Delegates em C#Diferenças entre Threads, Tasks e Delegates em C#Aprenda as diferenças entre Threads, Tasks e Delegates em C#. Este tutorial prático ensina como otimizar a execução paralela e melhorar o desempenho. e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. seu awaiter padrão para orquestrar nossas operações assíncronasRepositório Assíncrono: Como Estruturar o Acesso a DadosRepositório Assíncrono: Como Estruturar o Acesso a DadosDescubra como implementar um repositório assíncrono em C# seguindo boas práticas de separação de responsabilidades e eficiência de dados., mas existem casos em que precisamos de um comportamento mais sob medida, seja para otimizar a checagem de status, seja para manipular eventos externos antes de considerar a tarefa🤝 GitHub Básico: Versionamento para Iniciantes!🤝 GitHub Básico: Versionamento para Iniciantes!Descubra como o GitHub facilita colaboração, versionamento e organização de código com este tutorial prático e essencial para desenvolvedores iniciantes. concluída.

Neste tutorial, exploraremos:

Visão Geral sobre Awaiters🔗

O Awaiter é o componente que entra em ação quando📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. usamos o operador await⚡ Async/Await: Programação Assíncrona sem Callbacks!⚡ Async/Await: Programação Assíncrona sem Callbacks!Aprenda a aplicar Async/Await em C# para criar aplicações responsivas, evitar travamentos e melhorar a escalabilidade com exemplos práticos e dicas essenciais. em um objeto. Ele define como o compilador deve verificar o término de uma tarefa e como o código deve prosseguir assim que a tarefa🤝 GitHub Básico: Versionamento para Iniciantes!🤝 GitHub Básico: Versionamento para Iniciantes!Descubra como o GitHub facilita colaboração, versionamento e organização de código com este tutorial prático e essencial para desenvolvedores iniciantes. estiver concluída. Em nível avançado, o compilador C# traduz await⚡ Async/Await: Programação Assíncrona sem Callbacks!⚡ Async/Await: Programação Assíncrona sem Callbacks!Aprenda a aplicar Async/Await em C# para criar aplicações responsivas, evitar travamentos e melhorar a escalabilidade com exemplos práticos e dicas essenciais. objeto para chamadas a métodos e propriedades⚡ Propriedades: Get e Set com Elegância (e sem Campos Privados Bagunçados)!⚡ Propriedades: Get e Set com Elegância (e sem Campos Privados Bagunçados)!Aprenda como utilizar propriedades em C# para encapsular dados, validar informações e manter um código organizado, seguro e de fácil manutenção. de um Awaiter, como GetAwaiter(), IsCompleted, OnCompleted(...) e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. GetResult().

Ao criarmos Awaiters personalizados, normalmente precisamos implementar a interface📜 Interfaces: Contratos que Garantem a Ordem no Universo OOP!📜 Interfaces: Contratos que Garantem a Ordem no Universo OOP!Descubra como as interfaces em C# funcionam como contratos que garantem implementações flexíveis e robustas, facilitando o design e testes de sistemas. INotifyCompletion, ou, em alguns casos, ICriticalNotifyCompletion, dependendo do nível de controle que queremos exercer na retomada do fluxo.

Por que Criar Awaiters Personalizados?🔗

Nem sempre as operações assíncronasRepositório Assíncrono: Como Estruturar o Acesso a DadosRepositório Assíncrono: Como Estruturar o Acesso a DadosDescubra como implementar um repositório assíncrono em C# seguindo boas práticas de separação de responsabilidades e eficiência de dados. que desenvolvemos se encaixam perfeitamente no padrão TaskDiferenças entre Threads, Tasks e Delegates em C#Diferenças entre Threads, Tasks e Delegates em C#Aprenda as diferenças entre Threads, Tasks e Delegates em C#. Este tutorial prático ensina como otimizar a execução paralela e melhorar o desempenho./ValueTask. Algumas situações em que um Awaiter customizado é útil:

Métodos e Propriedades Fundamentais🔗

Um Awaiter padrão em C# deve prover ao menos:

Método/PropriedadeDescrição
IsCompletedPropriedade que indica se a operação já foi concluída.
GetResult()Método que retorna o resultado da operação (caso haja um retorno). Se não houver retorno, pode ser void.
OnCompleted(Action)Método que recebe uma ação a ser executada quando a operação assíncrona estiver concluída.

Passo a Passo: Criando um Awaiter Personalizado🔗

Vamos criar📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!Descubra os fundamentos do REST e boas práticas para criar APIs simples, escaláveis e eficientes. Domine métodos HTTP e status codes com exemplos práticos. um pequeno Awaiter que simula a esperaCriando seu Primeiro Programa Assíncrono: do Zero ao DeployCriando seu Primeiro Programa Assíncrono: do Zero ao DeployAprenda a configurar seu ambiente, criar e executar um projeto assíncrono em C# com async/await e prepare o deploy da sua aplicação com segurança. por um intervalo de tempo, porém de forma totalmente customizada. Isso é apenas um exemplo didático para ilustrar os pontos centrais da implementação.

Definindo a Classe de Espera

Vamos começar definindo uma classe🏗️ Classes vs. Structs: Quando Usar Cada Uma (e Não Quebrar a Cabeça)!🏗️ Classes vs. Structs: Quando Usar Cada Uma (e Não Quebrar a Cabeça)!Descubra como escolher entre classes e structs em C#. Aprenda sobre alocação de memória, passagem por valor e referência, e performance nesta explicação clara. que representará nossa operação de espera simulada:

using System;
using System.Runtime.CompilerServices;
using System.Threading;
public class CustomDelay
{
    private readonly int _milliseconds;
    public CustomDelay(int milliseconds)
    {
        _milliseconds = milliseconds;
    }
    // Método essencial para o uso com 'await'
    public CustomDelayAwaiter GetAwaiter()
    {
        return new CustomDelayAwaiter(_milliseconds);
    }
}

Implementando o Awaiter

Agora, precisamos criar a classe🏗️ Classes vs. Structs: Quando Usar Cada Uma (e Não Quebrar a Cabeça)!🏗️ Classes vs. Structs: Quando Usar Cada Uma (e Não Quebrar a Cabeça)!Descubra como escolher entre classes e structs em C#. Aprenda sobre alocação de memória, passagem por valor e referência, e performance nesta explicação clara./estrutura que efetivamente implementa os métodos e propriedades⚡ Propriedades: Get e Set com Elegância (e sem Campos Privados Bagunçados)!⚡ Propriedades: Get e Set com Elegância (e sem Campos Privados Bagunçados)!Aprenda como utilizar propriedades em C# para encapsular dados, validar informações e manter um código organizado, seguro e de fácil manutenção. esperados pelo compilador:

public struct CustomDelayAwaiter : INotifyCompletion
{
    private readonly int _milliseconds;
    private Timer _timer;
    public bool IsCompleted { get; private set; }
    public CustomDelayAwaiter(int milliseconds)
    {
        _milliseconds = milliseconds;
        _timer = null;
        IsCompleted = false;
    }
    public void OnCompleted(Action continuation)
    {
        // Inicializa um timer que, ao expirar, marca IsCompleted como true e chama a continuação.
        _timer = new Timer(_ =>
        {
            IsCompleted = true;
            _timer.Dispose();
            _timer = null;
            continuation();
        }, null, _milliseconds, Timeout.Infinite);
    }
    public void GetResult()
    {
        // Caso fosse necessário retornar algum valor, faríamos aqui.
        // O compilador chamará este método depois de IsCompleted == true.
    }
}

Usando o Awaiter

Podemos agora criar um método assíncronoComo Funciona o Operador 'await' e o que Significa 'async' nos MétodosComo Funciona o Operador 'await' e o que Significa 'async' nos MétodosAprenda a usar async e await em C# para processar tarefas demoradas sem bloquear sua aplicação. Torne o código legível e eficiente, melhorando a performance. para ilustrar o comportamento:

public static async Task TestCustomDelay()
{
    Console.WriteLine("Iniciando teste do CustomDelay...");
    // Aguarda nosso atraso personalizado de 2 segundos
    await new CustomDelay(2000);
    Console.WriteLine("Concluído atraso personalizado.");
}

Considerações Importantes🔗

Conclusão🔗

Awaiters personalizados oferecem uma forma de aprofundar e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. ajustar o comportamento do async/await⚡ Async/Await: Programação Assíncrona sem Callbacks!⚡ Async/Await: Programação Assíncrona sem Callbacks!Aprenda a aplicar Async/Await em C# para criar aplicações responsivas, evitar travamentos e melhorar a escalabilidade com exemplos práticos e dicas essenciais. às particularidades do seu contexto. Embora o uso mais frequente ainda seja com TaskDiferenças entre Threads, Tasks e Delegates em C#Diferenças entre Threads, Tasks e Delegates em C#Aprenda as diferenças entre Threads, Tasks e Delegates em C#. Este tutorial prático ensina como otimizar a execução paralela e melhorar o desempenho. e APIs de alto nível, entender como criar📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!Descubra os fundamentos do REST e boas práticas para criar APIs simples, escaláveis e eficientes. Domine métodos HTTP e status codes com exemplos práticos. e ajustar Awaiters sob medida pode trazer benefícios em cenários📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. onde o controle minucioso sobre a finalização de uma operação é fundamental.

Com a abordagem descrita, você tem o passo a passo essencial para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais!:

1. Entender o fluxo “padrão” que o compilador esperaCriando seu Primeiro Programa Assíncrono: do Zero ao DeployCriando seu Primeiro Programa Assíncrono: do Zero ao DeployAprenda a configurar seu ambiente, criar e executar um projeto assíncrono em C# com async/await e prepare o deploy da sua aplicação com segurança..

2. Implementar as interfaces📜 Interfaces: Contratos que Garantem a Ordem no Universo OOP!📜 Interfaces: Contratos que Garantem a Ordem no Universo OOP!Descubra como as interfaces em C# funcionam como contratos que garantem implementações flexíveis e robustas, facilitando o design e testes de sistemas. necessárias (INotifyCompletion).

3. Personalizar a maneira como você sinaliza ao compilador que a operação terminou (via IsCompleted e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. OnCompleted(Action)).

A partir daqui, você poderá criar📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!Descubra os fundamentos do REST e boas práticas para criar APIs simples, escaláveis e eficientes. Domine métodos HTTP e status codes com exemplos práticos. soluções mais elaboradas, sempre adequando o Awaiter às suas necessidades específicas.

Autor: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.

Referências🔗

Compartilhar artigo

Artigos Relacionados