.NET Framework
Konteksty synchronizacji
Szukaj…
Uwagi
Kontekst synchronizacji jest abstrakcją, która pozwala kodowi na przekazywanie jednostek pracy do harmonogramu, bez konieczności świadomości, w jaki sposób praca zostanie zaplanowana.
Konteksty synchronizacji są tradycyjnie używane do zapewnienia działania kodu w określonym wątku. W aplikacjach WPF i Winforms kontekst prezentacji zapewnia wątek SynchronizationContext
reprezentujący wątek interfejsu użytkownika. W ten sposób SynchronizationContext
można traktować jako wzorzec producent-konsument dla delegatów. Wątek roboczy wygeneruje kod wykonywalny (delegat) i ustawi go w kolejce lub wykorzysta w pętli komunikatów interfejsu użytkownika.
Task Parallel Library zapewnia funkcje automatycznego przechwytywania i używania kontekstów synchronizacji.
Wykonaj kod w wątku interfejsu użytkownika po wykonaniu pracy w tle
W tym przykładzie pokazano, jak zaktualizować składnik interfejsu użytkownika z wątku w tle za pomocą SynchronizationContext
void Button_Click(object sender, EventArgs args)
{
SynchronizationContext context = SynchronizationContext.Current;
Task.Run(() =>
{
for(int i = 0; i < 10; i++)
{
Thread.Sleep(500); //simulate work being done
context.Post(ShowProgress, "Work complete on item " + i);
}
}
}
void UpdateCallback(object state)
{
// UI can be safely updated as this method is only called from the UI thread
this.MyTextBox.Text = state as string;
}
W tym przykładzie, jeśli spróbujesz bezpośrednio zaktualizować MyTextBox.Text
w pętli for
, otrzymasz błąd wątkowania. Po opublikowaniu akcji UpdateCallback
w SynchronizationContext
pole tekstowe jest aktualizowane w tym samym wątku, co reszta interfejsu użytkownika.
W praktyce aktualizacje postępów należy wykonywać przy użyciu instancji System.IProgress<T>
. Domyślna implementacja System.Progress<T>
automatycznie przechwytuje kontekst synchronizacji, w którym jest tworzony.