Quindi ho un compito che può essere preformato dalla mia GUI che estrarrà informazioni per popolare un ViewModel con risposta alle query del database SQL. Supponiamo di voler iniziare questa attività e di mantenere la mia gui libera per procedere con altre cose e, nel frattempo, riprodurre un'animazione di "ricerca", qual è il modo corretto di farlo in WPF/MVVM? Suppongo che sia necessario avviare un processo asincrono e impostare un bool legato a un datatrigger che avvia lo storyboard dell'animazione. Ma cosa utilizzo per avviare il processo? Filo? Sono ancora nuovo a WPF e voglio solo assicurarmi che sto usando le classi giuste disponibili per me.Modo corretto in WVF MVVM per avviare un'attività di ricerca con thread
risposta
Uso il thread BackgroundProcess per fare cose come questa.
Ecco un link a MSDN su questo: http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx
Ulteriori dettagli relativi a questo.
Sono presenti tre EVENTI associati all'oggetto BackgroundProcess: DoWork, ReportProgress e WorkCompleted.
Ora, per usare questo - e per usarlo con una raccolta di dati osservabile - vorrete dire all'oggetto BackgroundProcess di essere in grado di REPORT PROGRESS (questa è una proprietà booleana che ho sempre esplicitamente impostato, insieme al consente la cancellazione).
Ora per avviare un processo, chiameremo il metodo RunWorkerAsync. Questo metodo ha la capacità di accettare una variabile OBJECT nel caso in cui sia necessario passarlo (se si desidera più di 1 valore, creare una struct da passare in RunWorkerAsync).
RunWorkerAsync spegne l'evento DoWork, quindi il controllo passa al gestore di eventi DoWork. Ecco il codice (sterilizzata) da dove sto utilizzandolo:
Dim dt As System.Data.DataTable
dt = da.GetDataTable(sql, System.Data.CommandType.Text, params)
For Each row As System.Data.DataRow In dt.Rows
If loadQuestionsWorker.CancellationPending Then
e.Cancel = True
Exit Sub
End If
Dim item As New DataObject
// Assign Item Values
backgroundProcessObject.ReportProgress(1, item)
Next
Quello che sta succedendo qui, è che sto ricevendo un DataTable dal mio livello dei dati, e quindi mentre questo backgroundprocess non viene annullata, io sono camminando sulla tabella dati, e quando costruisco un nuovo DataObject, riporto l'oggetto come costruito.
Ora, nel mio gestore di eventi ProgressChanged (il metodo ReportProgress genera l'evento ProgressChanged) il controllo è di nuovo nelle mani del thread dell'interfaccia utente, quindi posso fare cose come avere un impatto sull'interfaccia utente e aggiungere l'elemento che sto segnalando a ObservableCollection.
Infine, nel mio gestore di eventi WorkedCompleted (il cui evento corrispondente viene generato quando il metodo del gestore di eventi DoWork è in esecuzione), controllo se i miei progressi sono stati annullati (che a volte significa che voglio scaricare ObservableCollection) e I può o non può avere un impatto l'interfaccia utente (come la rimozione di un'animazione "ricerca".
È possibile avviare una nuova Thread
o BackgroundWorker
esplicitamente, o utilizzare un ThreadPool
. io non sono a conoscenza di alcun modo consigliato di fare questo in MVVM ...
Se l'operazione asincrona sta compilando un ObservableCollection associato a un controllo, notare che non è possibile aggiungere articoli su un thread diverso. È necessario farlo sul thread del dispatcher del controllo. Oppure si può anche usare this collection, che genera l'evento CollectionChanged sul filo adeguata
Penso di avere un problema correlato qui alla raccolta Observable, il mio codice è basato su MVVM e quindi il mio operatore sta apportando delle modifiche al modello di vista ... quel modello di vista è legato agli elementi dell'interfaccia utente ... quindi si blocca . – Firoso
Il binding su proprietà scalari funziona bene su thread, la notifica di modifica viene automaticamente impostata sul thread corretto. Per le raccolte, non è supportato. Vedi il link che ti ho dato per una possibile soluzione –
var t = new Thread((ThreadStart)delegate
{
DoWork(...)
Dispatcher.BeginInvoke((Action)delegate
{
SomethingOntheUiThread(...)
FinishedWork(...);
}
});
t.Start();
- 1. Campioni WVF MVVM con database
- 2. WVF MVVM: in che modo ViewModels comunica tra loro?
- 3. Modo corretto di utilizzare MVVM Light Messenger
- 4. WVF MVVM Utilizzo di comandi e gestori di eventi
- 5. Modo corretto di avviare mongodb ed express?
- 6. Qual è il modo corretto di avviare un thread sospeso in Delphi 2007?
- 7. Modo corretto per avere un thread infinito di lavoro?
- 8. È questo il modo corretto di implementare MVVM?
- 9. Modo corretto per verificare se i thread sono stati eseguiti?
- 10. WVF MVVM: INPC e comunicazione di mediazione tra modello di vista e modello
- 11. Notifica avanzamento thread in background in MVVM?
- 12. async Task.Run con MVVM
- 13. Android: modo corretto per passare un messaggio dal thread in background al thread dell'interfaccia utente?
- 14. è possibile utilizzare <i: Interaction.Triggers> in WVF MVVM (non in Silverlight)
- 15. Modo corretto per concatenare Task
- 16. WPF MVVM modo corretto per generare l'evento in mostra dal ViewModel
- 17. Qual è il modo corretto per inizializzare un modello e visualizzare in CAL WPF MVVM
- 18. Modo corretto per aggiornare i record nel pattern MVVM per il massimo rendimento
- 19. Modo corretto di gestire i thread nel kernel?
- 20. Modo corretto per gestire l'UAC in C#
- 21. Modo corretto per richiedere estensioni con browserify
- 22. Corretto il thread destroy
- 23. WVF MVVM - Unità Test di un comando - Metodi privati vs pubblici?
- 24. Qual è un modo corretto per avviare l'attività pianificata sulla piattaforma Java EE 5 (JBoss)?
- 25. Modo corretto per programmare una casella di testo di ricerca in angularJs
- 26. Come avviare il thread del coniglio in Rails and Thin
- 27. Qual è il modo corretto per avviare il server dai voti per il test?
- 28. Scaffolding per WPF con MVVM?
- 29. È questo il modo corretto per impostare il nome di un thread in Delphi 6?
- 30. Modo corretto per raggruppare in MVC4
provato questo, sembra chiudere la mia GUI tho ... – Firoso
se si blocca la vostra interfaccia grafica si sta facendo male. –
stavo sbagliando, sono andato al thread, guardando questo però mi piace molto questo. – Firoso