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.



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow