C# 多线程操作静态List的一个问题

将来现在 2013-03-17 01:40:51
问一个菜鸟问题
winfrom 程序一个 静态的List集合
我是用的多线程 一个线程删除 ListInfo.Remove(ListInfo[i]);
一个线程获取执行修改 先查找到序号 ListInfo[i].id = "";
这里会不会出现一个问题 我先查找的序号,然后第一个线程执行删除 把这个序号变了(实现上我的理解是不是第一个线程执行删除List里的一个对象,那我之前取到的序号是不是也变了?)
那不是我在执行修改的时候 会修改成其他的?有点急,希望大家帮帮忙.
...全文
410 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
private static object LockFlag = new object();//全局

//具体程序片断
paralell.foreach(list,(m)=>
{

lock(LockFlag )
{
    //想要执行的代码,
}

});

 

将来现在 2013-03-17
  • 打赏
  • 举报
回复
经过测试了 ,会发生这种情况,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好像没得排序得 有点悲剧.
  • 打赏
  • 举报
回复
没写类型,修改一下
private static object LockFlag = new object();
  • 打赏
  • 举报
回复
举个例子:
private static LockFlag = new object();
然后读写ListInfo都要使用它互斥,例如
lock(LockFlag)
{
    var x = ListInfo[i];
    ListInfo.Remove(x);
}
注意,不仅仅是写,往往在读ListInfo的时候也需要。
将来现在 2013-03-17
  • 打赏
  • 举报
回复
杂没得人来呢?难道分少了?

110,208

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧