用 ConcurrentQueue
<T> 作为容器,然后设定一个 Timer,周期性检查队列,同时 Push 的时候判断队列大小,超过一定大小强制取出所有消息执行。
思想类似的,我的想法是通过一个线程和while循环来实现,while里面是一个维护的delegate,通过delegate里面的函数去获取用户的数据进行处理。现在的问题是我现在delegate里面怎么去删除当前执行了(或者即将执行的)的函数
@技术改变这个世界: 使用 Timer,没必要额外创建一个线程监听队列。你后面的什么delegate获取数据啥的,我实在是看不懂,请你讲浅显点。
@Launcher: Timer不也是会去创建一个线程吗,只是实现方法不一样。
delegate里面不是函数列表嘛,用户不放具体数据,只是放一个取数据的函数地址,从该函数地址中可以取到数据。
@技术改变这个世界:
Timer不也是会去创建一个线程吗,只是实现方法不一样 —— 为啥我提了后你不去求证,非要在这里说你的错误结论呢?自己去查下 CreateTimerQueueTimer 的解释,然后学习下 C# 中的 Timer 的实现源码。
delegate里面不是函数列表嘛,用户不放具体数据,只是放一个取数据的函数地址,从该函数地址中可以取到数据 —— 我看不懂,请把你的需求说出来,别在这里传播你的解决方案。
PS:不要在 C# 中讲函数地址,理解起来困难。要不,咋就讨论用 C/C++ 实现的方案。
@Launcher:
我的想法是把用户的消息存储起来,在系统空闲的时候去执行。我是希望用户给的是函数引用,通过函数引用去实现消息内容的实时生成。
我刚刚用啦,所以到这边来提个问题,参考分析下高手们的实现方案。
Timer的实现源码是用Reflector看吗?
@技术改变这个世界:
ConcurrentQueue<Action> queue;
Action a1 = ()=>{};
queue.Enqueue(a1);
Action a2;
queue.TyrDequeue(out a2);
a2();
@Launcher:
多谢,C#源码是用Reflector看吗?
@技术改变这个世界: 可以用 Reflector,.net 也开源了。
@Launcher:
如果新来一个事件,我发现里面已经存在一个了,使用ConcurrentQueue能否做到删除原来的加入新的?
@技术改变这个世界: 不能。
既然是消息队列了,为什么会有这个问题..
这个消息队列是我自己做的,我系统的消息队列没有用过,想自己抽象一个消息队列来维护。
目标是用户发来的消息放到一个地方,在系统空闲的时候依次取出来执行,你有好的算法或方案来实现吗?
@技术改变这个世界: 跑一个消息分发线程,从队列中获取消息,分发给执行的对象处理.
楼上的不错哇。。。ConcurrentQueue<Action>
ConcurrentQueue很牛?还是 Action很牛?
@技术改变这个世界: 额,一个是线程安全同步的队列,一个是无参数、无返回值的方法指针。结合起来就是你说的方法队列哇。
@幻天芒:
如果需要传递参数的情况呢?
@技术改变这个世界: ConcurrentQueue<Model{Action,Dictionary<paramName:string,paramValue:object>}>
@幻天芒:
C# 刚刚学很多不懂,怎么个学习法?
@技术改变这个世界: 写代码,搜索,看书,写代码。