首页新闻找找看学习计划

Dictionary<int,Item>中删除一项,对其它地方引用会造成影响吗?

0
悬赏园豆:100 [已解决问题] 解决于 2013-11-21 11:42

我定义了一个静态字典,两个线程,一个写,一个修改状态,

写的时候:在字典中添加一项并把这个对像的引用返回,等待另一个线程修改对像的状态。

修改的时候:修改字典中指定key的状态,并从字典中删除此对像

 

我想问的是,如果删除以后,这个对像的引用是否还能正常使用。比如,我等待修改以后,继续根据这个对像来做一个判断之关的。。另外,我个人试验了一下,是可以获得这个对像的,但是我们老大说有问题,可能是还没删除之前使用的,在删除以后,此对像只读,可能被覆盖?

问题补充:

补充一下,_dicItems是一个静态字典。大致代码

public Item Send(xxx){

Item obj = new Obj

_dicItems.add(1,obj)

return obj

}

另一边(另一个线程中)

public void SetComplete(){

_dicItems[1].IsComplete=true;

_dicItems.Remove(1);

}

使用时:

var item = xxx.Send(xxx);

item.WaitForComplete();

if(Item.IsComplete)

   xxx

else

   xxx

因为在complete()完成以后,item已经从字典中删除了,因为我定义的item是一个对像,实事上我觉得放到字典中的也只是一个引用,删除后应该不会对item造成影响,我们老大说可能有影响。求解释

Never.Net的主页 Never.Net | 初学一级 | 园豆:112
提问于:2013-11-18 13:56
< >
分享
最佳答案
0

具体有没问题,得看你这个“删除”是什么操作。

如果仅仅是把它的指针从字典移除,那是完全没问题。

但是还是要注意一个线程问题,因为你这种做法可能会有线程安全问题出现,例如线程A在遍历字典做相应操作时,线程B突然从字典中删除一个对象,那样可能会出现一些不想发生的结果。。

收获园豆:50
_cha1R | 菜鸟二级 |园豆:403 | 2013-11-18 17:48
其他回答(5)
0

这个对像的引用还能正常使用.

因为那个对象还被其他地方引用着.

 

dic存的是"指针".

【秦时明月】 | 园豆:803 (小虾三级) | 2013-11-18 14:20
0

以你的需求来说,完全没问题。

林J | 园豆:202 (菜鸟二级) | 2013-11-18 15:06
0

如果Item是引用类型(class,interface...而不是struct)的话没有问题。

如果是的话,有问题,但问题不出在这里。

收获园豆:10
deerchao | 园豆:8167 (大侠五级) | 2013-11-18 19:18
0

这个显然是要考虑线程安全,那么,最基本的思路,先用上线程安全的对象

System.Collections.Concurrent.ConcurrentDictionary

至于其他问题,再在这个基础上考虑

Alvin | 园豆:828 (小虾三级) | 2013-11-19 10:13
0

遍历时不能删除和添加,其他没有任何问题,引用的对象该怎么用就怎么用

收获园豆:20
钧梓昊逑 | 园豆:945 (小虾三级) | 2013-11-20 10:50
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册