问题描述
现在我有一个这样的需求,在一个集合中。同时有多个现成访问集合的元素,在访问的同时,还可能会对集合进行排序。而这种情况下,可能在遇到正在排序的过程中枚举成员,造成存在的集合元素没有被找出来。请问,这样的情况有没有解决方案?
解决方案
解决方案二:
加锁啊,特别对于排序时,只允许一个线程访问,排序完后,解锁,其他线程才可进入,最简单的lock
解决方案三:
因为我的排序是异步进行的。所以排序也有可能是多个线程。现在造成的情况是,在排序之前获取了枚举器,然后排序,然后枚举。。。这样就会找不到元素了。我贴下我的代码吧,希望高手能够给与指点。在下感谢了:publicclassXmlConfigSortedList<T>:List<T>,IEnumerable<T>whereT:IMatchedContainer{///<summary>///获取当前集合中项的总被匹配次数。///</summary>publiclongMatchCount{get;privateset;}///<summary>///当集合中存在一个匹配的配置节点。则事件会被触发///</summary>protectedeventMatchCompletedDelegate<T>MatchCompleted;///<summary>///构造方法///</summary>publicXmlConfigSortedList(){this.MatchCompleted+=CurrentItemStatusChanged;this.MatchCompleted+=Sort;}voidSort(objectsender,Te){constintn=5;//每N次匹配成功,就进行一次排序。//if(this.MatchCount%n==0){//QueueWorkForSort(this);AsynchronizeSort(this);}}voidCurrentItemStatusChanged(objectsender,Te){e.MatchSuccess();this.MatchCount++;}///<summary>///指示当前集合成功匹配了指定项。并同时维护集合状态。也同时指示当前集合针对参数T成功匹配过一次。该方法一定会抛出///</summary>///<paramname="matchItem">已被匹配的对象</param>publicvoidMatchedFor(TmatchItem){MatchCompleted(this,matchItem);}publicnewIEnumerator<T>GetEnumerator(){lock(this){//vararr=newT[this.Count];//CopyTo(arr);//returnarr.AsEnumerable().GetEnumerator();returnbase.GetEnumerator();}}///<summary>///异步对指定对象进行排序。///</summary>///<paramname="lst">要进行排序的对象</param>privatevoidAsynchronizeSort(XmlConfigSortedList<T>lst){intavailableThreads;intcompletedThreads;ThreadPool.GetAvailableThreads(outavailableThreads,outcompletedThreads);if(availableThreads>0){ThreadPool.QueueUserWorkItem(QueueWorkForSort,lst);}}privatevoidQueueWorkForSort(objectdata){lock(this){XmlConfigSortedList<T>list=dataasXmlConfigSortedList<T>;if(list!=null){list.Sort(newComparison<T>((i1,i2)=>i2.MatchCount.CompareTo(i1.MatchCount)));}}}}///<summary>///指示指定的集合对象已完成排序。///</summary>///<paramname="sender"></param>///<paramname="e"></param>publicdelegatevoidMatchCompletedDelegate<inT>(objectsender,Te)whereT:IMatchedContainer;
解决方案四:
其实我就是要做一个实时排序,并按照一定的权重提升集合中某个元素的索引值,以达到在枚举时能够尽可能的减少查找时所需要的时间、
解决方案五:
我不能让我的集合同步执行排序,那样会有性能差别。就算加入了次数限制也是一样,是不允许的。所以只能选择异步排序,同步枚举