Attualmente sto progettando/rilavorando la parte di associazione dati di un'applicazione che fa un uso pesante di WinCat Databinding e aggiornamenti provenienti da un thread in background (una volta al secondo su> 100 record).Scenario databinding multi-thread WinForms, best practice?
Supponiamo che l'applicazione sia un'applicazione di compravendita di azioni, in cui un thread in background monitora le modifiche dei dati e li inserisce negli oggetti dati. Questi oggetti sono memorizzati in un BindingList<>
e implementano INotifyPropertyChanged
per propagare le modifiche tramite associazione dati ai controlli Winforms. Inoltre gli oggetti dati stanno attualmente eseguendo il marshalling delle modifiche tramite WinformsSynchronizationContext.Send
nel thread dell'interfaccia utente. L'utente è in grado di inserire alcuni dei valori nell'interfaccia utente, il che significa che alcuni valori possono essere modificati da entrambi i lati. E i valori utente non dovrebbero essere sovrascritti dagli aggiornamenti.
Quindi ci sono diversi questione venire in mente:
- C'è un generale disegno-guildline come fare (aggiornamenti in background in associazione dati)?
- Quando e come effettuare il marshalling sul thread dell'interfaccia utente?
- Qual è il modo migliore del thread in background per interagire con gli oggetti binding/dati ?
- Quali classi/interfacce dovrebbero essere utilizzate? (BindingSource, ...)
- ...
L'interfaccia utente in realtà non sanno che c'è un thread in background, che aggiorna il controllo, ed a partire da mia comprensione in scenari di associazione dati del shouldn UI' so da dove provengono i dati ... Puoi pensare al thread in background come a qualcosa che spinge i dati nell'interfaccia utente, quindi non sono sicuro che il backgroundworker sia l'opzione che sto cercando.
A volte si desidera ottenere una risposta dell'interfaccia utente durante un'operazione nell'oggetto dati/business (ad esempio l'impostazione dello sfondo durante i ricalcoli). Aumentare un propertychanged su una proprietà status legata allo sfondo non è sufficiente, in quanto il controllo viene ridipinto dopo che il calcolo è terminato? La mia idea sarebbe quella di agganciare l'evento propertychanged e chiamare .update() sul controllo ... Qualche altra idea al riguardo?
System.ComponentModel.BackgroundWorker, può essere parte della soluzione, ma il problema più difficile è come mantenere i dati aggiorna velocemente senza guardare fuori dal thread dell'interfaccia utente. Fare quanto sopra senza che ogni altra riga di codice debba pensare al blocco o alle chiamate incrociate. –
Se guardi il Backgroundworker non c'è molta differenza per generare un thread e maresciallo con WindowsFormsSynchronizationContext il BW fa lo stesso. –
Vedere la modifica per la risposta. – Dun3