Sobes.tech
Middle

Mi a szinkronizációs kontextus a C#-ban?

sobes.tech MI

Válasz az MI-től

A C#-ban a SynchronizationContext egy absztrakciót nyújt a szálak kezeléséhez, lehetővé téve delegáltak végrehajtását meghatározott kontextusban. Kulcsszerepet játszik a GUI szálak (pl. WinForms, WPF) és az ASP.NET kezelésében, biztosítva az interfész elemeinek helyes frissítését vagy a logika végrehajtását a megfelelő szálon.

Fő funkciók:

  • Send(SendOrPostCallback d, object state): Szinkron módon végrehajt egy delegáltat a kontextusban. A hívó szál blokkolódik, amíg a delegált be nem fejeződik.
  • Post(SendOrPostCallback d, object state): Aszinkron módon végrehajt egy delegáltat a kontextusban. A hívó szál nem blokkolódik.

Használati példák:

  • WPF vagy WinForms esetén a SynchronizationContext.Current a UI szálat fogja reprezentálni. A Post vagy Send használatával biztonságosan frissíthetjük az interfész elemeit háttérszálról.
  • ASP.NET Core-ban alapértelmezés szerint nincs SynchronizationContext, és a kérések közvetlenül a pool szálakra érkeznek. Régebbi ASP.NET verziókban létezett egy szinkronizációs kontextus, amely biztosította a kérések ugyanazon a kontextusban történő végrehajtását.
// WinForms példakód a UI frissítésére háttérszálról
private void button1_Click(object sender, EventArgs e)
{
    SynchronizationContext uiContext = SynchronizationContext.Current; // UI kontextus lekérése

    Task.Run(() =>
    {
        // Hosszú művelet végrehajtása háttérszálon
        Thread.Sleep(2000);

        // Címke frissítése a szinkronizációs kontextus segítségével
        uiContext.Post(_ => label1.Text = "Frissítve!", null);
    });
}