Question

J'ai un bug étrange, s'il vous plaît, laissez-moi savoir si vous avez des indices sur la raison.

J'ai un Timer (System.Windows.Forms.Timer) sur ma principale forme, ce qui déclenche des mises à jour, qui mettent à jour également à terme la principale interface de formulaire. Ensuite, j'ai un éditeur, qui est ouvert à partir de la forme principale en utilisant la méthode de ShowDialog(). Sur cet éditeur, j'ai un PropertyGrid (System.Windows.Forms.PropertyGrid).

Je suis incapable de le reproduire à chaque fois, mais assez souvent, quand j'utilise dropdowns sur cette grille de propriété dans l'éditeur, il est bloqué, c'est des boutons OK / Annuler ne ferment pas la forme, la grille de la propriété devient pas utilisable, le bouton Fermer dans l'en-tête sous forme ne fonctionne pas.

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

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

Était-ce utile?

La solution

Qu'est-ce qui se passe est que la méthode de minuterie de fil Tick n'exécute pas sur un thread différent, il est donc bloquer tout le reste jusqu'à ce qu'il soit fait. 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 même il a bloqué que vous avez décrit. Ce qui suit a résolu le problème:

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

private void DoStuff(object something)
{
    Thread.Sleep(6000);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top