我定义了一个静态字典,两个线程,一个写,一个修改状态,
写的时候:在字典中添加一项并把这个对像的引用返回,等待另一个线程修改对像的状态。
修改的时候:修改字典中指定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造成影响,我们老大说可能有影响。求解释
具体有没问题,得看你这个“删除”是什么操作。
如果仅仅是把它的指针从字典移除,那是完全没问题。
但是还是要注意一个线程问题,因为你这种做法可能会有线程安全问题出现,例如线程A在遍历字典做相应操作时,线程B突然从字典中删除一个对象,那样可能会出现一些不想发生的结果。。
这个对像的引用还能正常使用.
因为那个对象还被其他地方引用着.
dic存的是"指针".
以你的需求来说,完全没问题。
如果Item是引用类型(class,interface...而不是struct)的话没有问题。
如果是的话,有问题,但问题不出在这里。
这个显然是要考虑线程安全,那么,最基本的思路,先用上线程安全的对象
System.Collections.Concurrent.ConcurrentDictionary
至于其他问题,再在这个基础上考虑
遍历时不能删除和添加,其他没有任何问题,引用的对象该怎么用就怎么用