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.Currentbędzie reprezentować wątek UI. UżyciePostlubSendpozwala bezpiecznie aktualizować elementy interfejsu z wątku tła. - W ASP.NET Core, domyślnie,
SynchronizationContextnie 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);
});
}