J'ai trouvé un problème de réentrance lors de l'utilisation de NotifyIcons. Il est vraiment facile de reproduire, juste déposer un NotiftIcon sur un formulaire et l'événement click devrait ressembler à ceci:Réentrance Gui avec attente gérée
private bool reentrancyDetected;
private void notifyIcon1_MouseClick(object sender, MouseEventArgs e)
{
if (reentrancyDetected) MessageBox.Show("Reentrancy");
reentrancyDetected = true;
lock (thisLock)
{
//do nothing
}
reentrancyDetected = false;
}
commencent également un fil d'arrière-plan qui provoquera une affirmation:
private readonly object thisLock = new object();
private readonly Thread bgThread;
public Form1()
{
InitializeComponent();
bgThread = new Thread(BackgroundOp) { IsBackground = true };
bgThread.Start();
}
private void BackgroundOp()
{
while (true)
{
lock (thisLock)
{
Thread.Sleep(2000);
}
}
}
Maintenant, si vous commencer à cliquer sur l'notifyicon le message apparaîtra, indiquant la réentrance. Je suis conscient des raisons pour lesquelles l'attente gérée dans STA devrait pomper des messages pour certaines fenêtres. Mais je ne suis pas sûr pourquoi les messages de notifyicon sont pompés. Existe-t-il également un moyen d'éviter le pompage sans utiliser d'indicateurs booléens lors de l'entrée/de la sortie des méthodes?
Merci beaucoup.Tout à fait logique, nous transmettons donc le message aux formulaires WndProc où il n'y a pas de réentrée. En passant, il y a quelques bonnes ressources sur le blocage géré ici: http://blogs.msdn.com/b/cbrumme/archive/2003/04/17/51361.aspx et ici: http://blogs.msdn.com /b/cbrumme/archive/2004/02/02/66219.aspx – jomi