2010-10-06 4 views
3

У меня проблема с условиями гонки с winforms.Winform ListViewItem Проверено состояние Toggle

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; 
     } 
    } 

Иногда окно сообщения отображается дважды. Каков правильный способ сделать это? Заранее спасибо!

+0

Вы программно устанавливаете элементы как отмеченные? Единственный способ воспроизвести вашу проблему - установить более одного элемента, как это было проверено программно. – kevev22

+0

Да, фактически сразу после предложения first if есть цикл, который очищает (устанавливает в false) некоторые другие флажки в том же ListView. Я не думал, что это будет актуально. Я ожидал, что некоторые события будут уволены, а затем пойманы первым, если это будет условно. – Gleno

+0

Возможно, это поможет: http://msdn.microsoft.com/en-us/library/c5kehkcz(v=VS.100).aspx – kyndigs

ответ

1

Не могли бы вы просто поставить вокруг него простой замок? Кроме того, я хотел бы предложить переключение способ проверяемого логика работает, чтобы упростить функцию немного (удалить возвращение в середине функции)

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; 
      } 
     } 
    } 
} 

многочисленные способы повышения производительности, но это должно, по крайней мере остановить условия гонки?

Смежные вопросы