WPF rendre thread se bloque

j'éprouve un problème dans une application wpf où le thread render cesse de rendre, mais le thread UI et les threads helper sont toujours des messages de pompage.

il semble être lié à la corruption du cache de police de présentation, mais cela semble peu probable, que l'application récupère amende lors du redémarrage.

le thread de rendu sera de temps en temps suspendu, empêchant les mises à jour de dessin, mais le thread D'UI est toujours des messages de pompage.

Nous avons vu un problème similaire (similaire à ici ) qui s'est produit lors de l'application d'une transformation d'échelle à un texte qui a été résolu en supprimant le cache de police, mais ce problème particulier n'est pas reproductible de manière fiable.

Quelle est la meilleure façon de diagnostiquer la cause de ce problème?

j'ai ouvert un bug avec microsoft à connect , mais il ne sera pas considéré à moins que d'autres voix.

24
demandé sur Community 2011-05-26 05:50:44

5 réponses

le gel a été causé par une vidéo de rendu de contrôle activex hébergée.

il y avait une condition de course dans la façon dont la commande utilisait directshow qui a causé la suspension de directx.

nous avons trouvé ce problème en prenant un dump process avec procdump , puis en ouvrant le fichier dump sous windows debugger .

chasse autour du filet et inspection les callstacks natifs ont montré un problème où le octet d'ordre Élevé d'un pointeur de section critique était mis à zéro, ce qui signifie que l'un des threads attendait sur une section critique inexistante qui ne peut jamais être signalée.

cela nous a permis de créer un hang reproductible en exerçant le code qui a commencé et stoppé la vidéo. On a enlevé les commandes, et la suspension s'est arrêtée.

5
répondu LukeN 2011-07-14 16:49:17

Je ne sais pas pourquoi cela arrive, mais je l'ai déjà vécu. Il est plus facile de l'observer dans les systèmes qui ciblent framework 4.0 et fonctionnent sur des machines plus anciennes (XP, Vista).

ce que j'ai fait pour résoudre était:

  1. Supprimer FontCache3.0.0.0.dat
  2. désactiver de façon permanente le service de cache de police sur la machine incriminée

Solution 1 travaillé dans une machine XP. Il a également fonctionné dans un Vista la machine, mais après un certain temps, le problème s'est manifesté de nouveau.

pour supprimer FontCache3.0.0.0.dat vous devrez arrêter le service "Windows Presentation Foundation Font Cache 3.0.0" avant de pouvoir supprimer ce fichier. À Vista il est situé sous c:\windows\serviceprofiles\localservice\appdata\local. Sous XP c'est en vertu de c:\windows\system32\documents and settings\localservice\local settings\application data (j'ai du mispelled un dossier)

j'ai j'ai également constaté que le fait de désactiver complètement le système (solution 2) n'affectait pas les performances de mes applications .net.

1
répondu Padu Merloti 2011-06-02 02:43:36

la seule façon de trouver la cause profonde du problème est d'effectuer une journalisation constante à partir du fil jusqu'à ce que vous puissiez trouver une raison pour laquelle il est suspendu. Je peux suggérer beaucoup de façons de faire cette journalisation, mais cela dépend de la complexité du code dans le thread de rendu. Sans avoir beaucoup d'informations de débogage (le genre de chose qui introduit assez de latence pour résoudre temporairement le problème, pas moins) vous n'allez pas être en mesure de creuser jusqu'à la seule fois où il se produit.

si vous pouvez le répéter dans VS, alors vous devriez utiliser une connexion de la console autour des parties de problème prévues, sinon vous allez probablement avoir à tirer dans un fichier-texte, ou l'Envoyer à l'enregistreur du système.

pouvez-vous obtenir qu'il se reproduise dans une application simple qui ne fait que le rendu et les parties connexes du reste de l'application, ou est-ce qu'il se produit seulement (ne peut se produire?) dans le programme complet?

1
répondu jcolebrand 2011-06-05 22:10:04

, Vous pouvez utiliser un service de surveillance qui efface le cache lorsque le service détecte le problème. Le service devrait procéder à un sondage périodique lorsque votre demande est en cours d'exécution.

je serai le premier à admettre qu'il s'agit d'une solution sous-optimale et, à moins que vous ne soyez en mesure d'allumer et d'éteindre le service pendant de petites tranches de temps, vous êtes susceptible de vider les batteries assez rapidement.

0
répondu Zian Choy 2011-05-30 22:43:20

je pense que vous devez utiliser un sondage en boucle qui vérifie en continu si le logiciel est en cours d'exécution et le réinitialise chaque fois que le logiciel est suspendu.

0
répondu Eljay 2011-06-05 22:04:54