De contrôle.Invoke() de l'application se bloque
Je fais preuve d'une animation lors de mon contrôle du chargement des données. Lorsque le thread se termine, je me cache de l'animation et de montrer le contrôle. Donc, je suis l'exécution de ce code à partir d'un thread:
protected void InvokeEnableBackControl()
{
if (this.InvokeRequired)
{
this.Invoke(new OpHandler(EnableBackControl));
}
else
{
EnableBackControl();
}
}
Parfois, lorsque j'exécute ce code, le thread principal est pendu dans le code suivant:
protected virtual void EnableBackControl()
{
if (overlayAnimation.TargetControl != null)
{
overlayAnimation.TargetControl.BringToFront();
}
overlayAnimation.SendToBack();
overlayAnimation.Enabled = false;
overlayAnimation.Visible = false;
}
Je ne suis pas sûr si c'est pendu réglage de la Enable
ou Visible
de la propriété. Connaissez-vous toutes les circonstances qui peuvent en main de l'application l'appel de ces propriétés à partir d'une Control.Invoke
?
Est-il une similitude à la fois, il se bloque?
seulement "parfois". Ennuyeux.
Document de la exact déclaration il se bloque sur, post la trace de la pile.
seulement "parfois". Ennuyeux.
Document de la exact déclaration il se bloque sur, post la trace de la pile.
OriginalL'auteur Daniel Peñalba | 2011-02-25
Vous devez vous connecter pour publier un commentaire.
Noter que
Control.Invoke
est synchrone, donc il faudra attendre pourEnableBackControl()
de retour. Pensez à utiliserControl.BeginInvoke
, que vous pouvez "fire and forget."Voir cette réponse: Quelle est la différence entre Invoke() et BeginInvoke()
OriginalL'auteur bentsai
J'ai couru dans des problèmes avant, quand je suis en cours d'exécution .Invoquer sur un thread d'arrière-plan pendant que mon thread principal est toujours occupé - cela donne l'impression que l'application est accroché, à cause de la .Invoquer se trouve juste là, en attente pour le thread principal de répondre qu'il accorde de l'attention. Causes possibles:
Lorsque vous attacher le débogueur, une attention particulière à ce que votre commande principale MessagePump thread est en train de faire, je crois, son manque d'attention est la cause de votre problème. Si vous vous apercevez que c'est une boucle dans votre thread principal qui ne répond pas, essayez d'insérer un
.DoEvents
dans la boucle, ce qui permettra de mettre en pause l'exécution et la force de le thread principal pour vider le message de la pompe et de la route de toutes les demandes en suspens.OriginalL'auteur SqlRyan
Exécuter en debug, de faire application de l'accrocher et ensuite pause de débogage dans Visual Studio et d'inspecter les threads.
Peñalba c'est le genre de solution qui m'aide. Parce que quand vous faites cela, vous pouvez voir les lignes exactes où thread se bloque.
Je l'ai fait. La ligne en surbrillance lorsque je casse tous les threads est
overlayAnimation.Visible = false;
mais généralement Visual Studio (presque 2003) s'arrête à la ligne précédente. Seulement parfois, c'est la raison pour laquelle je ne suis pas sûr si c'est que la ligne ou la précédente.OriginalL'auteur Andrey
Ce que j'ai découvert est que le dessin/peinture de contrôle peut être assez lente, esp si vous avez beaucoup d'entre eux et/ou d'utiliser le double buffering pour un bon rafraîchissement. J'ai été en utilisant BeginInvoke pour mettre à jour un contrôle de liste de données que j'ai été reçu à partir d'une prise. À la fois les mises à jour ont été passe si vite qu'il a été le gel de l'application. J'ai résolu ce problème par écrit tout ce que j'ai reçu dans les sockets asynchrones recevoir à une file d'attente, puis dans un sujet séparé, la file d'attente les données et à l'aide de BeginUpdate et EndUpdate sur la liste et de faire toutes les mises à jour entre les deux. Cette découper une tonne supplémentaire de redessiner et fait de l'application beaucoup plus réactif.
OriginalL'auteur Steed
Vous devez utiliser
BeginInvoke
inestedInvoke
voir ce LienOriginalL'auteur alireza amini