Sobes.tech
Middle

Co je to synchronizační kontext v C#?

sobes.tech AI

Odpověď od AI

V C# poskytuje SynchronizationContext abstrakci pro dispatchování práce na vlákna, což umožňuje spouštět delegáty v určitém kontextu. Hraje klíčovou roli při správě GUI vláken (například WinForms, WPF) a ASP.NET, zajišťuje správné aktualizace prvků rozhraní nebo provádění logiky ve správném vlákně.

Hlavní funkce:

  • Send(SendOrPostCallback d, object state): Synchronně vykoná delegáta v kontextu. Volající vlákno je zablokováno do dokončení delegáty.
  • Post(SendOrPostCallback d, object state): Asynchronně vykoná delegáta v kontextu. Volající vlákno není blokováno.

Příklady použití:

  • V WPF nebo WinForms, SynchronizationContext.Current bude představovat UI vlákno. Použití Post nebo Send umožňuje bezpečně aktualizovat prvky rozhraní z pozadí vlákna.
  • V ASP.NET Core, ve výchozím nastavení, SynchronizationContext neexistuje a požadavky jsou přímo předávány vláknům z poolu. Ve starších verzích ASP.NET existoval kontext synchronizace, který zajišťoval provádění požadavků ve stejném kontextu.
// Příklad použití ve WinForms pro aktualizaci UI z pozadí
private void button1_Click(object sender, EventArgs e)
{
    SynchronizationContext uiContext = SynchronizationContext.Current; // Získání kontextu UI

    Task.Run(() =>
    {
        // Provedení dlouhé operace na pozadí
        Thread.Sleep(2000);

        // Aktualizace štítku přes kontext synchronizace
        uiContext.Post(_ => label1.Text = "Aktualizováno!", null);
    });
}