DEV Community

Cover image for Você já usou o System.Threading.Channels?
Angelo Belchior
Angelo Belchior

Posted on • Edited on

5 1 1 1 1

Você já usou o System.Threading.Channels?

System.Threading.Channels é uma biblioteca dotnet que fornece uma API de canal de comunicação de dados baseada em buffer para sincronização de threads. Essa biblioteca permite que você transmita dados de forma segura e sincronizada entre threads, tornando mais fácil criar aplicativos multithread de alta performance.

O canal é criado usando uma das implementações fornecidas, como o canal simples ou o canal limitado em tamanho de buffer, e pode ser usado para enviar e receber valores. As operações de envio e recebimento são bloqueadas até que haja espaço disponível no buffer ou até que um valor esteja disponível, respectivamente. Isso garante que as threads sejam sincronizadas e evita o famigerado racing condition.

Além disso, os canais também fornecem suporte a cancelamentos, o que significa que você pode interromper uma operação de envio ou recebimento em andamento se necessário.
Um exemplo singelo de como usar um canal simples para transmitir dados entre duas threads:

using System;
using System.Threading.Channels;
using System.Threading.Tasks;

var channel = Channel.CreateUnbounded<int>(/*Você pode informar uma quantidade máxima de items a serem processados*/);

// Inicia a primeira thread para enviar dados ao canal
var sender = Task.Run(async () =>
{
    for (int i = 0; i < 5; i++)
    {
        Console.WriteLine("Sender enviando: " + i);
        await channel.Writer.WriteAsync(i);
    }
    channel.Writer.Complete();
});

// Inicia a segunda thread para receber dados do canal
var receiver = Task.Run(async () =>
{
    while (await channel.Reader.WaitToReadAsync())
    {
        if (channel.Reader.TryRead(out int item))
        {
            Console.WriteLine("Receiver recebendo: " + item);
        }
    }
});

await Task.WhenAll(sender, receiver);
Console.WriteLine("Todas as mensagens foram transmitidas e recebidas.");
Enter fullscreen mode Exit fullscreen mode

No exemplo acima, criamos um canal simples usando Channel.CreateUnbounded() e iniciamos duas threads. A primeira thread usa o método WriteAsync do canal para enviar valores inteiros e a segunda thread usa o método WaitToReadAsync e TryRead para receber os valores enviados. Quando a primeira thread chama channel.Writer.Complete(), isso indica que não haverá mais valores a serem transmitidos e a segunda thread para de esperar por novos dados.

Sem dúvida, o System.Threading.Channels é uma ferramenta poderosa para sincronização de threads no dotnet, que fornece uma API simples e eficiente para garantir que as threads sejam sincronizadas ao transmitir dados.

Se você estiver trabalhando em um aplicativo multithread, considere usar o System.Threading.Channels para simplificar a sincronização de threads e melhorar o desempenho do seu aplicativo.

Recomendo esse ótimo post: An Introduction to System.Threading.Channels — .NET Blog (microsoft.com)

A documentação é bem completa e recomendo muito a leitura: Channels — .NET | Microsoft Learn

Você já usou? Se sim, compartilha conosco o seu caso de uso :)
Até a próxima!

Image of Timescale

🚀 pgai Vectorizer: SQLAlchemy and LiteLLM Make Vector Search Simple

We built pgai Vectorizer to simplify embedding management for AI applications—without needing a separate database or complex infrastructure. Since launch, developers have created over 3,000 vectorizers on Timescale Cloud, with many more self-hosted.

Read more

Top comments (2)

Collapse
 
djrafaelfernand profile image
Marco Rafael

Um tempo atrás, eu fiz um programinha windows de traduções de texto. Uma das funções incluidas nele é a opção de traduzir em tempo real, o que entrava na área de transferência.

Basicamente, eu ficava monitorando ela, e quando o texto era diferente do guardado atualmente na aplicação, ou diferente de null, eu pegava, traduzia e exibia pro leitor de telas.

Só que a forma que fiz o monitoramento da área de transferência eu acho que foi uma gambiarra das boa rsrsrs.

Eu basicamente coloquei todo o código do monitor para rodar em segundo plano, pq eu não precisava receber nada de volta dele.

Será que essa função ficaria melhor dessa forma, com Channels?

Collapse
 
angelobelchior profile image
Angelo Belchior

Sensacional mano!!! Nesse caso eu eu não sei se o Channels ajudaria muito. Eu fiz um post sobre Pipelines. Acho que no seu caso, Pipelines ajudaria, já que daria pra vc ir processando partes do texto. Se for um texto grande, seria interessante quebrar em partes e usar o Pipeline: dev.to/angelobelchior/processando-...

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more