.NET Framework
Synchronisatiecontexten
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.