Zoeken…


Opmerkingen

Een synchronisatiecontext is een abstractie waarmee code kan worden gebruikt om werkeenheden door te geven aan een planner, zonder dat u hoeft te weten hoe het werk zal worden gepland.

Synchronisatiecontexten worden traditioneel gebruikt om ervoor te zorgen dat code op een specifieke thread wordt uitgevoerd. In WPF- en Winforms-applicaties wordt een SynchronizationContext geboden die de UI-thread vertegenwoordigt door het presentatieraamwerk. Op deze manier kan SynchronizationContext worden gezien als een producent-consumentpatroon voor gedelegeerden. Een werkthread zal uitvoerbare code (de gemachtigde) produceren en in de wachtrij zetten of het verbruik door de UI-berichtenlus.

De Task Parallel Library biedt functies voor het automatisch vastleggen en gebruiken van synchronisatiecontexten.

Voer code uit op de UI-thread na het uitvoeren van achtergrondwerk

Dit voorbeeld laat zien hoe u een UI-component van een achtergrondthread kunt bijwerken met behulp van een 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;
}

In dit voorbeeld krijgt u een threading-fout als u probeert om MyTextBox.Text rechtstreeks in de for lus bij te werken. Door de UpdateCallback actie te posten in SynchronizationContext , wordt het tekstvak bijgewerkt op dezelfde thread als de rest van de gebruikersinterface.

In de praktijk moeten voortgangsupdates worden uitgevoerd met behulp van een exemplaar van System.IProgress<T> . De standaardimplementatie System.Progress<T> legt automatisch de synchronisatiecontext vast waarop deze is gemaakt.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow