问一个菜鸟问题
    winfrom 程序一个 静态的List集合 
  我是用的多线程  一个线程删除 ListInfo.Remove(ListInfo[i]);
 一个线程获取执行修改 先查找到序号 ListInfo[i].id = "";
  这里会不会出现一个问题   我先查找的序号,然后第一个线程执行删除  把这个序号变了(实现上我的理解是不是第一个线程执行删除List里的一个对象,那我之前取到的序号是不是也变了?)
  那不是我在执行修改的时候 会修改成其他的?有点急,希望大家帮帮忙. 多线程listc#

解决方案 »

  1.   

    举个例子:private static LockFlag = new object();
    然后读写ListInfo都要使用它互斥,例如lock(LockFlag)
    {
        var x = ListInfo[i];
        ListInfo.Remove(x);
    }
    注意,不仅仅是写,往往在读ListInfo的时候也需要。
      

  2.   

    没写类型,修改一下private static object LockFlag = new object();
      

  3.   

    经过测试了 ,会发生这种情况,2楼和3楼的 我发现即使锁住也会出现这种情况 
    我的测试代码是这样的
    先执行这个线程
    lock (UserInfo.List)
                {
                    for (int i = 0; i < UserInfo.List.Count; i++)
                    {
                        if (UserInfo.List[i].Name == 5 + "张三")
                        {
                            Thread.Sleep(5000);
                            UserInfo.List[i].Id = 900000000;
                            // UserInfo.List[i].Name = "王五";
                            break;
                        }
                    }
                    dataGridView1.DataSource = null;
                    dataGridView1.DataSource = UserInfo.List;
                }然后
      UserInfo.List.Remove(UserInfo.List[1]);            dataGridView1.DataSource = null;
                dataGridView1.DataSource = UserInfo.List;
    发现修改的错误 不是我想修改的.哎悲剧了,其他什么集合好用哎,hashtable好像没得排序得  有点悲剧.