Ricerca…


Osservazioni

Un contesto di sincronizzazione è un'astrazione che consente di utilizzare il codice per passare unità di lavoro a uno scheduler, senza richiedere la consapevolezza di come verrà pianificato il lavoro.

I contesti di sincronizzazione vengono tradizionalmente utilizzati per garantire che il codice venga eseguito su un thread specifico. Nelle applicazioni WPF e Winforms, il framework di presentazione fornisce un SynchronizationContext rappresenta il thread dell'interfaccia utente. In questo modo, SynchronizationContext può essere considerato un modello produttore-consumatore per i delegati. Un thread di lavoro produrrà il codice eseguibile (il delegato) e lo accoderà o consumerà dal loop di messaggi dell'interfaccia utente.

La Libreria parallela attività fornisce funzionalità per l'acquisizione e l'utilizzo automatico dei contesti di sincronizzazione.

Esegui codice sul thread dell'interfaccia utente dopo aver eseguito il lavoro in background

Questo esempio mostra come aggiornare un componente dell'interfaccia utente da un thread in background utilizzando un 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 questo esempio, se si è tentato di aggiornare direttamente MyTextBox.Text all'interno del ciclo for , si otterrebbe un errore di threading. UpdateCallback azione UpdateCallback su SynchronizationContext , la casella di testo viene aggiornata sullo stesso thread del resto dell'interfaccia utente.

In pratica, gli aggiornamenti dei progressi dovrebbero essere eseguiti utilizzando un'istanza di System.IProgress<T> . L'implementazione predefinita System.Progress<T> acquisisce automaticamente il contesto di sincronizzazione su cui è stato creato.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow