2010-10-06 9 views
3

J'ai un problème avec des conditions de course avec WinForms.Winform ListViewItem Statut Vérifié Basculer

listViewCollections.ItemChecked += foo //Somewhere 

    void foo(object sender, ItemCheckedEventArgs e) 
    { 
     if (e.Item.Checked == false) return; 
     bool flag = bar(e.Item.Index); 
     if (flag) { 
      MessageBox.Show(...) 
      e.Item.Checked = false; 
     } 
    } 

Parfois, la boîte de message s'affiche deux fois. Quelle est la bonne façon de faire cela? Merci d'avance!

+0

Est-ce que vous configurez les éléments par programmation? La seule façon de reproduire votre problème est de définir plus d'un élément par programmation. – kevev22

+0

Oui, juste après la première clause if, il y a une boucle qui efface (met à false) d'autres cases dans le même ListView. Je ne pensais pas que ce serait pertinent. Je m'attendrais à ce que certains événements soient virés et soient attrapés par le premier si conditionnel. – Gleno

+0

Peut-être que cela va vous aider: http://msdn.microsoft.com/en-us/library/c5kehkcz(v=VS.100).aspx – kyndigs

Répondre

1

Pourriez-vous pas mettre une serrure simple, autour d'elle? Aussi je suggère passer la façon dont la logique Vérifié fonctionne pour simplifier la fonction un peu (supprimer le retour mi-fonction)

private static object fooLock = new object(); 
void foo(object sender, ItemCheckedEventArgs e) 
{ 
    lock (fooLock) 
    { 
     if (e.Item.Checked) 
     { 
      if (bar(e.Item.Index)) 
      { 
       MessageBox.Show(...) 
       e.Item.Checked = false; 
      } 
     } 
    } 
} 

existe de nombreuses manières d'améliorer la performance, mais qui devrait au moins arrêter les conditions de course?

Questions connexes