In molte applicazioni il "thread UI" è speciale e gli aggiornamenti dell'interfaccia utente del framework devono essere inviati da questo thread.
Tuttavia, per evitare di bloccare l'interfaccia utente, le attività lente vengono eseguite nei thread in background e i risultati vengono propagati al thread dell'interfaccia utente per essere visualizzati.
Diversi quadri risolvono questo in modi leggermente diversi; ad esempio:
-
In WPF è possibile utilizzare
Application.Current.Dispatcher
per generare un'attività che viene eseguita nel thread dell'interfaccia utente. -
Su Android, puoi utilizzare
runOnUiThread
per inviare un'azione alla coda degli eventi per il thread dell'interfaccia utente. -
In QT si associa un gestore di eventi utilizzando il proprio sistema segnale / slot per ricevere notifiche dal thread in background e aggiornare utilizzando i gestori di eventi del thread UI.
-
In iOS utilizzi qualcosa come
dispatch_async(dispatch_get_main_queue()...
per attivare un'attività nella coda degli eventi dell'interfaccia utente.
Tutto leggermente diverso, ma in generale il modello è chiaro: il thread in background crea un Task
che poi pianifica per essere eseguito su un TaskQueue
che il thread UI periodicamente fornisce servizi in modo sincrono.
Tuttavia, non sono convinto che questa sia effettivamente la migliore pratica.
Certamente per pochi, grandi compiti in background è ragionevole.
... ma quando hai un grande fan-out in sotto-thread e una delega one-to-one di task-complete - > Compito dell'interfaccia utente, questo semplifica l'interfaccia utente con un sacco di piccoli compiti di aggiornamento, vanificando lo scopo di spostare il lavoro in thread di sfondi in primo luogo.
Sembra molto più vantaggioso avere un livello di aggregazione a livello di applicazione che combina e filtra gli aggiornamenti dell'interfaccia utente e trasmette solo i necessari attraverso il thread dell'interfaccia utente effettivo; in molti modi questo è effettivamente ciò che fa il 'Virtual DOM' (ma senza discussioni).
Quindi, c'è il caso d'uso.
Ecco la domanda:
- Qual è un modello efficace per scrivere un tale livello di aggregazione di thread?
(... e si noti che poiché si tratta di un'operazione solo dati, non vi è alcun requisito che questo layer sia servito da un singolo thread come il loop di eventi del thread UI, ma potrebbe essere in effetti ottimale per il servizio in arrivo aggiornamenti tramite un pool di thread)