2016-02-08 6 views
7

Ho un pulsante di dialogo di avvio che crea un modello di vista di una finestra e lo associa alla finestra (sta abilitando la virutalizzazione dell'interfaccia utente). Ci vuole solo 1 secondo per avviare la finestra di dialogo al primo clic. Ma se apro la stessa finestra di dialogo molto frequentemente o di seguito, inizia a impiegare più tempo nel popolamento dell'origine dati della griglia per l'iterazione successiva. se faccio qualche pausa, poi di nuovo apri la finestra, poi ci vogliono solo circa 1 o 2 secondi.Prestazioni relative alle prestazioni durante l'apertura ripetuta di una finestra di dialogo nel wpf

for first time populating the item source it take only 1 second: 
next time populating the item source it takes 2 second 
next time populating the item source it takes 3 second 
next time populating the item source it takes 6 second 
next time populating the item source it takes 8 second 

Tuttavia, se chiamo GC.Collect() che non è consigliato, poi popolare origine dati griglia richiede sempre circa 1 secondo. ma chiamando di

Gc.Collect() 
Gc.WaitForPendingFinalizer() 
Gc.Collect() 

mi è costato un po 'di tempo per ogni iterazione.

So che chiamare GC.Collect non è una buona opzione. Qualcuno può suggerire come posso aumentare le prestazioni delle mie applicazioni.

Sono più preoccupato per il computer dell'utente in quanto la mia macchina è dotata di una configurazione molto buona, mentre la macchina dell'utente potrebbe non essere così veloce.

+1

Perché è necessario più tempo per aprire la finestra di dialogo ogni volta? Forse stai caricando troppi dati. Considera di [utilizzare il paging] (http://stackoverflow.com/questions/784726/how-can-i-paginate-a-wpf-datagrid) (nella griglia e nella query sql). –

+0

Forse hai bisogno di '.Dispose' di alcune risorse prima di chiudere la finestra di dialogo? –

+0

Tim, anche io non capisco. Probabilmente mi manca qualcosa ma non so cosa.Così per cercare possibili errori –

risposta

3

È difficile individuare il problema esatto senza guardare il codice. Tuttavia, di solito questo può accadere a causa di alcuni motivi.

  1. Carica più dati (potrebbe essere il doppio?) Evertime. Hai indicato che carica solo 200 record ogni volta. Ma assicurati che la tua logica sia corretta e cancella i dati precedenti prima di ri-pubblicare.

  2. Assicurati di annullare l'iscrizione a qualsiasi sottoscrizione di eventi. A volte ci possono essere eventi hiden che si innescano per istanze di griglia precedenti. Puoi controllare facilmente mettendo una pausa su una maniglia uniforme e controllando se si innesca più di una volta.

  3. Controllare tutte le istanze monouso che si stanno creando e controllare se le si smaltiscono in modo appropriato. Probabilmente non stai eliminando l'istanza usa e getta e questo potrebbe essere il motivo per cui GC.Collect ti aiuta.

  4. Non sono abbastanza sicuro del coinvolgimento della virtualizzazione qui. Esegui lo stesso test senza virtualizzazione per assicurarti che non sia questo il motivo.

+0

grazie CharithJ, ho capito che è stato a causa di eventi che non stavo annullando la sottoscrizione, ma mi chiedo ancora che questo evento non sia stato generato automaticamente mentre sollevo manualmente questo evento eseguendo solo determinate azioni. Quindi non avrebbe dovuto influire sulle prestazioni. Ora, sono più interessato a sapere che l'archiviazione di così tanti gestori di eventi causa un impatto sulle prestazioni. Non capisco quella cosa. in termini di memoria, non stavano occupando quella quantità di memoria. anche se se ne occupano di più, come influisce sulla performance. potresti darmi qualche suggerimento a riguardo. –

+0

Non è necessario occupare molta memoria per sollevare problemi di memoria. Potresti avere a che fare con oggetti di grandi dimensioni? Leggi di https://www.simple-talk.com/dotnet/.net-framework/the-dangers-of-the-large-object-heap/ Ricorda di disporre tutti gli oggetti usa e getta poco prima che escano dal campo di applicazione . Implementare l'interfaccia IDisposable e annullare l'iscrizione da qualsiasi evento nel metodo Dispose. – CharithJ

+0

grazie mille per aver condiviso questo articolo, questo è esattamente quello che stavo cercando –