【求助】C#中的集合如何做到线程同步?

问题描述

现在我有一个这样的需求,在一个集合中。同时有多个现成访问集合的元素,在访问的同时,还可能会对集合进行排序。而这种情况下,可能在遇到正在排序的过程中枚举成员,造成存在的集合元素没有被找出来。请问,这样的情况有没有解决方案?

解决方案

解决方案二:
加锁啊,特别对于排序时,只允许一个线程访问,排序完后,解锁,其他线程才可进入,最简单的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;

解决方案四:
其实我就是要做一个实时排序,并按照一定的权重提升集合中某个元素的索引值,以达到在枚举时能够尽可能的减少查找时所需要的时间、
解决方案五:
我不能让我的集合同步执行排序,那样会有性能差别。就算加入了次数限制也是一样,是不允许的。所以只能选择异步排序,同步枚举

时间: 2024-07-29 04:25:15

【求助】C#中的集合如何做到线程同步?的相关文章

java中线程同步,线程让步,线程休眠的区别和联系是什么

问题描述 java中线程同步,线程让步,线程休眠的区别和联系是什么 java中线程同步,线程让步,线程休眠的区别和联系是什么 线程的本质还是一个运行中的类, 解决方案 线程同步:是保证多线程安全访问竞争资源的一种手段,java中常用的是加锁机制即synchronized同步代码块实现的. 线程让步的方法是yield(),休眠方法是sleep().sleep()方法和yield()方法都是Thread类的静态方法,都会使当前处于运行状态的线程放弃CPU,把运行机会让给别的线程. 两者的区别在于:s

ruby线程实现生产者消费者问题示例(队列Queue实现线程同步)_ruby专题

Ruby线程实现经典的生产者消费者问题,用ruby中的Queue类实现线程同步问题. 复制代码 代码如下: require "thread"  puts "ProAndCon"  queue = Queue.new    #用队列Queue实现线程同步  producer = Thread.new do      10.times do |i|          sleep rand(i) # 让线程睡眠一段时间          queue << i 

关于线程的中处理集合一些问题. 100分赏金来了

问题描述 整个生产数据的和处理数据的过程都需要快速.希望大侠们帮忙看看,帮小弟指出有什么需要优化的地方和容易出问题的地方//线程1---生产数据publicclassDataForWlanextendsThread{privateCardReaderForWlanrr;publicstaticSet<String>carIdAndTimeSet=Collections.synchronizedSet(newHashSet<String>());publicSet<String

大一小白求助工程中的多线程问题

问题描述 大一小白求助工程中的多线程问题 在一个工程的主函数里面,创建了多个线程(这几个线程的函数体是同一个),创建的时候给这个线程传递了类似编号的参数,每个线程传递进去的参数当然是不同的,在线程中会用到这个参数,如果用vs,传进去的这个参数不稳定,我的意思是每次都会有变化,不是我预想的值,导致结果不正确,但是用dev cpp运行就很正常,现在很苦恼,调试了好久都没发现错误在哪里.是不是同一个函数要创建多个线程的时候传递参数要注意什么特别的问题?要不然也太奇怪了,dev cpp运行明明很正常 我

改善C#程序的建议6:在线程同步中使用信号量

原文:改善C#程序的建议6:在线程同步中使用信号量 所谓线程同步,就是多个线程之间在某个对象上执行等待(也可理解为锁定该对象),直到该对象被解除锁定.C#中对象的类型分为引用类型和值类型.CLR在这两种类型上的等待是不一样的.我们可以简单的理解为在CLR中,值类型是不能被锁定的,也即:不能在一个值类型对象上执行等待.而在引用类型上的等待机制,则分为两类:锁定和信号同步. 锁定,使用关键字lock和类型Monitor.两者没有实质区别,前者其实是后者的语法糖.这是最常用的同步技术: 本建议我们讨论

C#中的线程(二)线程同步

Keywords:C# 线程Source:http://www.albahari.com/threading/Author: Joe AlbahariTranslator: Swanky WuPublished: http://www.cnblogs.com/txw1958/Download:http://www.albahari.info/threading/threading.pdf    第二部分:线程同步基础   同步要领 下面的表格列展了.NET对协调或同步线程动作的可用的工具: 简易

Guava中针对集合的 filter和过滤功能

Guava中针对集合的 filter和过滤功能 博客分类:  JAVA相关  在guava库中,自带了过滤器(filter)的功能,可以用来对collection 进行过滤,先看例子:     Java代码   @Test   public void whenFilterWithIterables_thenFiltered() {       List<String> names = Lists.newArrayList("John", "Jane", 

两个线程同时操作一个集合,一个线程读,一个线程写。有可能会产生并发问题吗?

问题描述 两个线程同时操作一个集合,一个线程读,一个线程写.有可能会产生并发问题吗? 我下面的代码为啥没有并发问题? 请哪位大神指导下 class Program { public Thread Threadone; public Thread Threadtwo; public event EventHandler EventRun; public static object obj=new object(); ArrayList ListArry = new ArrayList(); pri

java中List集合及其遍历详解_java

1. 首先List<E>集合继承与Collection<E>,是一个接口.    ①  Collection (集合框架是JDK1.2版本出现的)    ②   list:是有序的,元素可以重复,以为该集合体系有索引.      经常用到的是实现该接口的ArrayList和LinkedList类    ③   Arraylist:  底层的数据结构使用的是数组结构,   特点: 查询速度很快,但是增删稍慢.线程不同步          LinkedList: 底层使用的是链表数据结