Sobes.tech
Middle

Ce este contextul de sincronizare în C#?

sobes.tech AI

Răspuns de la AI

Contextul de sincronizare (SynchronizationContext) în C# oferă o abstracție pentru dispatching-ul lucrului pe thread-uri, permițând executarea delegaților într-un anumit context. Acesta joacă un rol cheie în gestionarea thread-urilor GUI (de exemplu, WinForms, WPF) și ASP.NET, asigurând actualizarea corectă a elementelor interfeței sau executarea logicii în thread-ul corespunzător.

Funcții principale:

  • Send(SendOrPostCallback d, object state): Execută delegatul în mod sincron în context. Thread-ul care apelează este blocat până când delegatul se finalizează.
  • Post(SendOrPostCallback d, object state): Execută delegatul în mod asincron în context. Thread-ul care apelează nu este blocat.

Exemple de utilizare:

  • În WPF sau WinForms, SynchronizationContext.Current va reprezenta thread-ul UI. Utilizarea Post sau Send permite actualizarea sigură a elementelor interfeței dintr-un thread de fundal.
  • În ASP.NET Core, în mod implicit, SynchronizationContext nu există, iar cererile sunt trimise direct către thread-urile din pool. În versiunile mai vechi de ASP.NET, exista un context de sincronizare care asigura executarea cererilor în același context.
// Exemplu de utilizare în WinForms pentru actualizarea UI-ului dintr-un thread de fundal
private void button1_Click(object sender, EventArgs e)
{
    SynchronizationContext uiContext = SynchronizationContext.Current; // Obține contextul thread-ului UI

    Task.Run(() =>
    {
        // Execută o operație lungă pe un thread de fundal
        Thread.Sleep(2000);

        // Actualizează eticheta prin intermediul contextului de sincronizare
        uiContext.Post(_ => label1.Text = "Actualizat!", null);
    });
}