Sobes.tech
Middle

Czym jest kontekst synchronizacji w C#?

sobes.tech AI

Odpowiedź od AI

Kontekst synchronizacji (SynchronizationContext) w C# zapewnia abstrakcję dla dispatchowania pracy wątków, umożliwiając wykonywanie delegatów w określonym kontekście. Odgrywa kluczową rolę w zarządzaniu wątkami GUI (np. WinForms, WPF) i ASP.NET, zapewniając poprawną aktualizację elementów interfejsu lub wykonywanie logiki w odpowiednim wątku.

Główne funkcje:

  • Send(SendOrPostCallback d, object state): Wykonuje synchronicznie delegata w kontekście. Wątek wywołujący jest blokowany do czasu zakończenia delegata.
  • Post(SendOrPostCallback d, object state): Wykonuje asynchronicznie delegata w kontekście. Wątek wywołujący nie jest blokowany.

Przykłady użycia:

  • W WPF lub WinForms, SynchronizationContext.Current będzie reprezentować wątek UI. Użycie Post lub Send pozwala bezpiecznie aktualizować elementy interfejsu z wątku tła.
  • W ASP.NET Core, domyślnie, SynchronizationContext nie istnieje, a żądania trafiają bezpośrednio do wątków z puli. W starszych wersjach ASP.NET istniał kontekst synchronizacji, który zapewniał wykonywanie żądań w tym samym kontekście.
// Przykład użycia w WinForms do aktualizacji UI z wątku tła
private void button1_Click(object sender, EventArgs e)
{
    SynchronizationContext uiContext = SynchronizationContext.Current; // Uzyskanie kontekstu UI

    Task.Run(() =>
    {
        // Wykonanie długotrwałej operacji w wątku tła
        Thread.Sleep(2000);

        // Aktualizacja etykiety przez kontekst synchronizacji
        uiContext.Post(_ => label1.Text = "Zaktualizowano!", null);
    });
}