(C#,多线程,字典)求一个思路!

要实现这么一个东西,我这儿有个dictionary,会不定时的往里add数据。另有一个线程(叫T吧)定时的拿这个dictionary,接下来就是要设计的部分:拿到这个dictionary后呢 ,需要根据里面每一个元素去做一个操作,这个操作不一定成功,如果成功后就将dictionary的这个元素去掉,如果不成功,就保留着,等待线程T再次拿到这个dictionary时,再操作。

dic里面元素可能很多,对每一个元素的操作可能比较费时,所以如果以同步的方式,可能还没遍历完dic,线程T就又开始了,所以应该用多线程吧,求一个思路。谢谢!

这个就是典型的消费者生产者问题,不过因为不清楚具体需求,如果是一般的处理,你可以考虑用queue<T>来替代dictionary(因为自带了Dequeue、Enqueue和peek方法,使用上要简单很多),通常两个线程就够了,一个生产,一个消费,消费者先判断queue中有没有数据,如果有的话就peek数据,操作成功后就Dequeue。如果你一定需要两个线程顺序执行,可以用Mutex进行互斥。追问

你说的我明白,你还是没仔细看我问题。我的消费者比较耗时间,而且需要每隔一段时间便利一下整个dic

追答

我觉的你没有说清楚,如果你只是想在消费者中再开多个线程来处理,那就可以考虑用AutoResetEvent数组,WaitHandle.WaitAll(AutoResetEvent[]);可以等待所有操作完成再继续。

温馨提示:内容为网友见解,仅供参考
第1个回答  2012-08-08
因为你这个集合是动态的 所以你这个集合是否 KEY有规律 如果没有规律 就得创建一个编号

多线程 假如10个
每个线程处理 集合 1/10 的数据 所以需要一个静态变量 来记录编号 每个线程来申请的时候 记录下这个编号 申请的时候要锁定

大致如下

public static Dictionary<int, object> list;
public static int listFlag;

lock(listFlag)
读取大于编号listFlag 的 10条?
记录 listFlag 等于最后一条的编号

这样你添加的同时也不会影响到读取
第2个回答  2012-08-08
创建2个线程,一个负责添加数据
一个负责读取数据。追问

请仔细看问题,谢谢

追答

我小学没有毕业

相似回答
大家正在搜