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å.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow