2009-04-09 8 views
1

J'ai un bug étrange, s'il vous plaît, faites-moi savoir si vous avez des indices sur la raison.Problème ShowDialog, PropertyGrid et Timer

J'ai un Timer (System.Windows.Forms.Timer) sur mon formulaire principal, qui déclenche des mises à jour, qui mettent également éventuellement à jour l'interface utilisateur du formulaire principal. Ensuite, j'ai un éditeur, qui est ouvert à partir du formulaire principal en utilisant la méthode ShowDialog(). Sur cet éditeur j'ai un PropertyGrid (System.Windows.Forms.PropertyGrid). Je ne parviens pas à le reproduire à chaque fois, mais assez souvent, quand j'utilise des listes déroulantes sur cette grille de propriétés dans l'éditeur, il se bloque, c'est OK/Annuler les boutons ne ferme pas le formulaire, la grille des propriétés devient inutilisable. bouton dans l'en-tête du formulaire ne fonctionne pas.

Il n'y a aucune exception en arrière-plan, et si je casse le processus, je vois que l'application fait des calculs liés aux mises à jour que j'ai mentionnées au début.

Que pouvez-vous recommander? Toutes les idées sont les bienvenues.

+0

Avez-vous déjà trouvé la cause de ce problème? – roken

+0

@roken: J'ai oublié :-) Je pense que nous avons utilisé une solution de contournement, comme l'arrêt des minuteries d'actualisation de l'interface utilisateur pendant qu'une boîte de dialogue modale est active ... –

+0

Triste jour. Merci pour la réponse, je ne peux pas attendre de vous que vous vous souveniez d'un problème d'il y a trois ans! – roken

Répondre

1

Ce qui se passe, c'est que la méthode Tick du temporisateur de threads ne s'exécute pas sur un thread différent, donc il verrouille tout le reste jusqu'à ce qu'il soit terminé. J'ai fait une application WinForms de test qui fixaient une minuterie et 2 boutons sur elle dont les événements ont fait ceci:

private void timer1_Tick(object sender, EventArgs e) 
{ 
    Thread.Sleep(6000); 
} 

private void button1_Click(object sender, EventArgs e) 
{ 
    timer1.Start(); 
} 

private void button2_Click(object sender, EventArgs e) 
{ 
    frmShow show = new frmShow(); 
    show.ShowDialog(); // frmShow just has some controls on it to fiddle with 
} 

et en effet il bloqué que vous avez décrit. Ce qui suit l'a résolu:

private void timer1_Tick(object sender, EventArgs e) 
{ 
    ThreadPool.QueueUserWorkItem(DoStuff); 
} 

private void DoStuff(object something) 
{ 
    Thread.Sleep(6000); 
} 
+0

Merci pour votre réponse, SnOrfus Mais il ne ressemble pas vraiment à ce que vous décrivez dans mon cas. Le thread de l'interface utilisateur n'est pas bloqué par les caluclations, je peux entrer dans le gestionnaire de fermeture de mon formulaire de rédacteur en chef ... Je peux passer à travers, mais la forme ne se ferme pas après! –

+0

Pourquoi était-ce accepté? répondre? Nous avons exactement le même problème et comme vous l'avez mentionné dans votre commentaire ci-dessus, ce problème n'est PAS dû au fait que le fil de l'interface utilisateur est simplement suspendu. La grille de propriétés est entièrement réactive, les événements de clic de bouton se déclenchent, mais le formulaire ne se ferme pas. – roken