首页 新闻 搜索 专区 学院

C# delegate的应用问题

0
悬赏园豆:10 [已解决问题] 解决于 2015-04-23 13:16

我现在需要维护一个消息队列,用户向消息队列中放消息,我在系统空闲的时候把消息队列中的消息取出来进行执行。
各位有没有好的数据结构和算法来实现?


我自己的初步想法是通过代理来做,用户把函数地址作为消息参数放到我的代理变量里面,我在空闲的时候去用户指定的函数地址里面取出命令来操作。现在遇到一个问题就是delegate中怎么去删除已经执行过的函数,有知道的吗,请告知谢谢!

技术改变这个世界的主页 技术改变这个世界 | 初学一级 | 园豆:195
提问于:2015-04-22 10:51
< >
分享
最佳答案
1

ConcurrentQueue<T> 作为容器,然后设定一个 Timer,周期性检查队列,同时 Push 的时候判断队列大小,超过一定大小强制取出所有消息执行。

收获园豆:10
Launcher | 高人七级 |园豆:45045 | 2015-04-22 11:32

思想类似的,我的想法是通过一个线程和while循环来实现,while里面是一个维护的delegate,通过delegate里面的函数去获取用户的数据进行处理。现在的问题是我现在delegate里面怎么去删除当前执行了(或者即将执行的)的函数

技术改变这个世界 | 园豆:195 (初学一级) | 2015-04-22 11:45

@技术改变这个世界: 使用 Timer,没必要额外创建一个线程监听队列。你后面的什么delegate获取数据啥的,我实在是看不懂,请你讲浅显点。

Launcher | 园豆:45045 (高人七级) | 2015-04-22 11:48

@Launcher: Timer不也是会去创建一个线程吗,只是实现方法不一样。

delegate里面不是函数列表嘛,用户不放具体数据,只是放一个取数据的函数地址,从该函数地址中可以取到数据。

技术改变这个世界 | 园豆:195 (初学一级) | 2015-04-22 11:53

@技术改变这个世界:

Timer不也是会去创建一个线程吗,只是实现方法不一样 —— 为啥我提了后你不去求证,非要在这里说你的错误结论呢?自己去查下 CreateTimerQueueTimer 的解释,然后学习下 C# 中的 Timer 的实现源码。

delegate里面不是函数列表嘛,用户不放具体数据,只是放一个取数据的函数地址,从该函数地址中可以取到数据 —— 我看不懂,请把你的需求说出来,别在这里传播你的解决方案。

 

PS:不要在 C# 中讲函数地址,理解起来困难。要不,咋就讨论用 C/C++ 实现的方案。

Launcher | 园豆:45045 (高人七级) | 2015-04-22 11:57

@Launcher: 

我的想法是把用户的消息存储起来,在系统空闲的时候去执行。我是希望用户给的是函数引用,通过函数引用去实现消息内容的实时生成。

 

我刚刚用啦,所以到这边来提个问题,参考分析下高手们的实现方案。

Timer的实现源码是用Reflector看吗?

技术改变这个世界 | 园豆:195 (初学一级) | 2015-04-22 14:16

@技术改变这个世界: 

ConcurrentQueue<Action> queue;

Action a1 = ()=>{};

queue.Enqueue(a1);

Action a2;

queue.TyrDequeue(out a2);

a2();

Launcher | 园豆:45045 (高人七级) | 2015-04-22 14:48

@Launcher: 

多谢,C#源码是用Reflector看吗?

技术改变这个世界 | 园豆:195 (初学一级) | 2015-04-22 14:57

@技术改变这个世界: 可以用 Reflector,.net 也开源了。

Launcher | 园豆:45045 (高人七级) | 2015-04-22 15:53

@Launcher: 

如果新来一个事件,我发现里面已经存在一个了,使用ConcurrentQueue能否做到删除原来的加入新的?

技术改变这个世界 | 园豆:195 (初学一级) | 2015-04-22 16:18

@技术改变这个世界: 不能。

Launcher | 园豆:45045 (高人七级) | 2015-04-22 16:40
其他回答(2)
0

既然是消息队列了,为什么会有这个问题..

吴瑞祥 | 园豆:29369 (高人七级) | 2015-04-22 10:54

这个消息队列是我自己做的,我系统的消息队列没有用过,想自己抽象一个消息队列来维护。

 

目标是用户发来的消息放到一个地方,在系统空闲的时候依次取出来执行,你有好的算法或方案来实现吗?

支持(0) 反对(0) 技术改变这个世界 | 园豆:195 (初学一级) | 2015-04-22 11:27

@技术改变这个世界: 跑一个消息分发线程,从队列中获取消息,分发给执行的对象处理.

支持(0) 反对(0) 吴瑞祥 | 园豆:29369 (高人七级) | 2015-04-22 11:38
0

楼上的不错哇。。。ConcurrentQueue<Action>

幻天芒 | 园豆:36910 (高人七级) | 2015-04-22 11:40

ConcurrentQueue很牛?还是 Action很牛?

支持(0) 反对(0) 技术改变这个世界 | 园豆:195 (初学一级) | 2015-04-22 11:48

@技术改变这个世界: 额,一个是线程安全同步的队列,一个是无参数、无返回值的方法指针。结合起来就是你说的方法队列哇。

支持(0) 反对(0) 幻天芒 | 园豆:36910 (高人七级) | 2015-04-22 13:39

@幻天芒: 

如果需要传递参数的情况呢?

支持(0) 反对(0) 技术改变这个世界 | 园豆:195 (初学一级) | 2015-04-23 09:08

@技术改变这个世界: ConcurrentQueue<Model{Action,Dictionary<paramName:string,paramValue:object>}>

支持(0) 反对(0) 幻天芒 | 园豆:36910 (高人七级) | 2015-04-23 09:22

@幻天芒: 

C# 刚刚学很多不懂,怎么个学习法?

支持(0) 反对(0) 技术改变这个世界 | 园豆:195 (初学一级) | 2015-04-23 13:18

@技术改变这个世界: 写代码,搜索,看书,写代码。

支持(0) 反对(0) 幻天芒 | 园豆:36910 (高人七级) | 2015-04-23 14:01
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册