.NET Framework
Synkroniseringskontekster
Sök…
Anmärkningar
Ett synkroniseringskontekst är en abstraktion som gör det möjligt för konsumera att koda för att skicka enheter av arbete till en schemaläggare, utan att kräva medvetenhet om hur arbetet ska schemaläggas.
Synkroniseringsförhållanden används traditionellt för att säkerställa att kod körs på en specifik tråd. I WPF- och Winforms-applikationer tillhandahålls en SynchronizationContext
representerar UI-tråden av presentationsramen. På detta sätt kan SynchronizationContext
ses som ett producent-konsumentmönster för delegater. En arbetartråd producerar körbar kod (delegaten) och står i kö eller konsumerar med UI-meddelandeslingan.
Task Parallel Library innehåller funktioner för att automatiskt fånga och använda synkroniseringskontekster.
Kör kod på UI-tråden efter att ha utfört bakgrundsarbete
Detta exempel visar hur du uppdaterar en UI-komponent från en bakgrundstråd med en 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;
}
I det här exemplet, om du försökte direkt uppdatera MyTextBox.Text
inne i for
loopen, skulle du få ett gängfel. Genom att lägga upp UpdateCallback
åtgärden i SynchronizationContext
uppdateras textrutan på samma tråd som resten av UI.
I praktiken ska framstegsuppdateringar utföras med hjälp av en instans av System.IProgress<T>
. Standardimplementeringen System.Progress<T>
fångar automatiskt synkroniseringskontakten den skapas på.