Winform ListViewItem Checked状态切换

3

我在winforms中遇到了竞态条件的问题。

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

有时消息框会显示两次。应该如何正确处理?提前致谢!

你是在程序中设置选项为已选中吗?我唯一能够复现你的问题的方式是通过在程序中设置多个选项为已选中。 - kevev22
是的,实际上在第一个if子句之后有一个循环,它清除(将其设置为false)同一ListView中的其他复选框。我认为这不会相关。我期望一些事件被触发,然后被第一个if条件捕获。 - Gleno
也许这会有所帮助:http://msdn.microsoft.com/zh-cn/library/c5kehkcz(v=VS.100).aspx - kyndigs
1个回答

1

你能不能在它周围放一个简单的锁呢?此外,我建议改变Checked逻辑的方式,以简化函数(删除中间的返回)。

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

有很多方法可以提高性能,但至少应该停止竞争条件吧?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接