.NET Framework
Contesti di sincronizzazione
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.