Domanda

La mia applicazione WPF ha utilizzato un elevato utilizzo della CPU dopo circa 30 minuti, quindi ho interrotto l'applicazione per scoprire quale codice ha speso un elevato utilizzo della CPU, ma non ho ottenuto nulla.

Visual Studio 2008 non può visualizzare il codice corrente, ma l'ho trovato in " Call Stack " Pannello:

[In a sleep, wait, or join] 
mscorlib.dll!System.Threading.WaitHandle.WaitAny(System.Threading.WaitHandle[] waitHandles, int millisecondsTimeout, bool exitContext) + 0x8f bytes 
System.dll!System.Net.TimerThread.ThreadProc() + 0x2f9 bytes    
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart_Context(object state) + 0x66 bytes   
mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, object state) + 0x6f bytes    
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart() + 0x44 bytes   

cos'è questo? cosa importa con un elevato utilizzo della CPU? e come ridurre l'utilizzo della CPU?

È stato utile?

Soluzione

Abbiamo utilizzato "Performance Profiling Tool per WPF" / Visual Profile per scoprire quali eventi richiedono la maggior parte dell'utilizzo della CPU. Spuntare (TimeManager.Tick ()) è stato necessario circa il 40% di utilizzo della CPU dell'app. quindi abbiamo rimosso tutti i controlli di animazione uno per uno, infine, abbiamo scoperto che uno storyboard avrebbe aumentato l'utilizzo della CPU dopo circa 30 minuti.

quindi abbiamo cambiato forma:


calendarStoryboard.Begin(txtMessage, HandoffBehavior.Compose, true);

a


calendarStoryboard.Begin(txtMessage, HandoffBehavior.SnapshotAndReplace, true);

questo problema è stato risolto. maggiori informazioni su HandoffBehavior fare riferimento a msdn:

http://msdn.microsoft .com / it-it / library / system.windows.media.animation.handoffbehavior.aspx

Altri suggerimenti

Dovresti dare un'occhiata agli altri thread, penso che l'interruttore per mostrare i thread sia nel menu di debug di Visual Studio. " [In modalità sleep, attendi o unisciti a " significa che il thread non può fare nulla perché è in attesa di un altro thread per completare l'operazione.

Potrebbe essere bloccato in un ciclo infinito da qualche parte, intenzionalmente o no (intenzionalmente come qualcosa dell'interfaccia utente che viene continuamente ridisegnato, come un'animazione o qualcosa del genere) Qualunque cosa sia, non è nel thread corrente mostrato nel tuo stack.

Hai alcune opzioni per rintracciare il tuo problema. Vorrei iniziare con Performance Wizard in Visual Studio 2008. Lo troverai nel menu Analizza.

Non sono un esperto di WPF, ma lo stack di chiamate che mostri qui probabilmente non è un problema. Quel thread è in attesa su qualche altro oggetto di sincronizzazione e non sta facendo alcun lavoro. Il motivo per cui VS non è in grado di visualizzare il codice in esecuzione è perché è in attesa nel codice nativo (una volta che chiami WaitAny () credo che tu chiami in un costrutto OS nativo che fa l'attesa effettiva).

Esistono altri thread in esecuzione nel processo WPF che potrebbero impiegare tempo CPU?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top