Sto utilizzando un controllo visivo nel mio progetto che proviene da una libreria a cui non dispongo dell'origine.
Ci vuole troppo tempo per aggiornare (200ms, approssimativamente) per una buona reattività dell'interfaccia utente con tre di questi controlli sullo schermo contemporaneamente. (Potrei aver bisogno di aggiornarli tutti e tre contemporaneamente, il che lascia la mia UI bloccata per ~ 600ms mentre stanno pensando tutti).Esecuzione di un controllo WPF in un'altra discussione
Ho letto alcuni post su TaskSchedulers e sto iniziando a esaminare le funzionalità di attività parallele come modo di eseguire ognuno di questi controlli nella loro stessa discussione. La piattaforma sarà multi-core, quindi voglio approfittare dell'elaborazione simultanea.
Il problema è che io non so nemmeno quello che non so come fare per questo, anche se ..
v'è un modello di design adatto alla corsa un controllo in un thread separato dal thread principale dell'interfaccia utente in WPF?
In particolare: è un controllo mappa di terze parti, che quando viene assegnata una nuova posizione o livello di zoom impiega troppo tempo per ridisegnare (~ 200 ms). Con forse tre di questi aggiornamenti ad un massimo di 4Hz - ovviamente non manterranno il passo ..
Ho incapsulato il controllo WPF in un controllo utente, e ho bisogno di eseguire ogni istanza nel proprio thread, mentre continuo a catturare l'input dell'utente (clic del mouse, ad esempio).
UPDATE: mentre mi sento in giro per una soluzione, ho implementato quanto segue finora.
Il mio thread principale (UI) genera un thread che crea una nuova finestra che contiene il controllo in questione e lo individua nella posizione corretta (in modo che assomigli a un normale controllo).
_leftTopThread = new Thread(() =>
{
_topLeftMap = new MapWindow()
{
WindowStartupLocation = WindowStartupLocation.Manual,
Width = leftLocation.Width,
Height = leftLocation.Height,
Left = leftLocation.X,
Top = leftLocation.Y,
CommandQueue = _leftMapCommandQueue,
};
_topLeftMap.Show();
System.Windows.Threading.Dispatcher.Run();
});
_leftTopThread.SetApartmentState(ApartmentState.STA);
_leftTopThread.IsBackground = true;
_leftTopThread.Name = "LeftTop";
_leftTopThread.Start();
Dove CommandQueue
è una coda Thread-safe BlockingCollection per inviare comandi alla mappa (spostando la posizione, ecc).
Il problema è ora che posso sia
- avere input dell'utente dovuto al
System.Windows.Threading.Dispatcher.Run()
chiamata - o blocco sul CommandQueue, ascolto dei comandi inviati dal filo principale
I non posso girare in attesa di comandi, perché assorbirebbe tutta la mia CPU di thread!
È possibile bloccare e che la pompa di segnalazione eventi funzioni?
controlli WPF Tutti devono essere aggiornati sul thread dell'interfaccia utente. Tuttavia, potremmo essere in grado di aiutarti se fornisci alcuni dettagli del controllo che stai utilizzando e qualsiasi codice che hai scritto per aggiornarlo/popolarlo. –
@ CameronPeters, sei sicuro che non ci possa essere più di un "thread UI"? – svick
Attualmente ho più thread "UI" in esecuzione al momento (grazie a Threading.Dispatcher.Run()), ma non posso bloccarli in attesa di segnali. – DefenestrationDay