Sobes.tech
Middle

Маъз чӣ гуна аст контексти ҳамоҳангсозӣ дар C#?

sobes.tech AI

Ҷавоб аз AI

C# тилида SynchronizationContext иш парчагларини бошқариш учун абстракция беради ва делегатларни белгиланган контекстда ишга тушириш имконини беради. У GUI иш парчаглари (масалан, WinForms, WPF) ва ASP.NETда асосий роль ўйнайди, интерфейс элементларининг тўғри янгиланиши ёки логикани тегишли иш парчагида бажарилишини таъминлайди.

Асосий функциялар:

  • Send(SendOrPostCallback d, object state): Синхрон равишда делегатни контекстда бажаради. Чақирувчи иш парчаги делегат тугашигача блокланади.
  • Post(SendOrPostCallback d, object state): Асинхрон равишда делегатни контекстда бажаради. Чақирувчи иш парчаги блокланмайди.

Ишлатиш мисоллари:

  • WPF ёки WinFormsда, SynchronizationContext.Current UI иш парчагини ифода қилади. Post ёки Sendдан фойдаланиш орқали фон иш парчагидан интерфейс элементларини хавфсиз янгилаш мумкин.
  • ASP.NET Coreда, стандарт ҳолда, SynchronizationContext мавжуд эмас ва сўровлар тўғридан-тўғри пул иш парчагларига келади. Эски версияларида, сўровларни бир хил контекстда бажаришни таъминлайдиган синхронлаштириш контексти мавжуд эди.
// WinFormsда фон иш парчагидан UIни янгилаш мисоли
private void button1_Click(object sender, EventArgs e)
{
    SynchronizationContext uiContext = SynchronizationContext.Current; // UI контекстни олиш

    Task.Run(() =>
    {
        // Узоқ давом этувчи операцияни фон иш парчагида бажариш
        Thread.Sleep(2000);

        // Синхронлаштириш контексти орқали белгини янгилаш
        uiContext.Post(_ => label1.Text = "Янгиланди!", null);
    });
}