Sobes.tech
Middle

O que é o contexto de sincronização em C#?

sobes.tech IA

Resposta da IA

O contexto de sincronização (SynchronizationContext) em C# fornece uma abstração para a gestão da execução de threads, permitindo executar delegados num contexto específico. Desempenha um papel fundamental na gestão de threads GUI (por exemplo, WinForms, WPF) e ASP.NET, garantindo a atualização correta dos elementos da interface ou a execução de lógica no thread apropriado.

Funções principais:

  • Send(SendOrPostCallback d, object state): Executa de forma síncrona um delegado no contexto. O thread que chama fica bloqueado até o delegado terminar a sua execução.
  • Post(SendOrPostCallback d, object state): Executa de forma assíncrona um delegado no contexto. O thread que chama não fica bloqueado.

Exemplos de uso:

  • Em WPF ou WinForms, SynchronizationContext.Current representará o thread da interface de utilizador. Usar Post ou Send permite atualizar de forma segura os elementos da interface a partir de um thread em segundo plano.
  • Em ASP.NET Core, por padrão, SynchronizationContext não existe, e as requisições chegam diretamente aos threads do pool. Em versões mais antigas do ASP.NET, existia um contexto de sincronização que garantia a execução das requisições no mesmo contexto.
// Exemplo de uso em WinForms para atualizar a UI a partir de um thread em segundo plano
private void button1_Click(object sender, EventArgs e)
{
    SynchronizationContext uiContext = SynchronizationContext.Current; // Obtenção do contexto do thread UI

    Task.Run(() =>
    {
        // Execução de uma operação prolongada num thread em segundo plano
        Thread.Sleep(2000);

        // Atualização do rótulo através do contexto de sincronização
        uiContext.Post(_ => label1.Text = "Atualizado!", null);
    });
}