我们需要为使用C#开发的应用程序开发某种缓冲区管理。
实际上,应用程序会在设备进入时接收消息(在很短的时间内可能会有很多消息)。我们需要在某种缓冲池中将它们排队,以便我们可以以托管方式处理它们。
我们考虑以256字节块分配一块内存(所有消息都少于此),然后使用缓冲池管理来获得可用于传入消息的可用缓冲池和准备好的缓冲池待处理。
所以流程将是“获取缓冲区”(处理它)“释放缓冲区”或“将其保留在池中”。我们还需要知道缓冲区何时填满。
潜在地,我们还需要一种方法来“窥视”缓冲区,以查看池中优先级最高的缓冲区是什么,而不是总是获取下一个缓冲区。
.NET中是否已经支持此功能,或者是否有一些我们可以使用的开源代码?
答案 0 :(得分:4)
C#sharps内存管理实际上非常好,因此您可以只分配您需要的内容并将其粘贴到队列中,而不是拥有缓冲池。完成缓冲后,让垃圾收集器处理它。
另一个选项(对应用程序知之甚少)是在获取消息时最低限度地处理消息,并将它们转换为完整的对象(具有优先级和全部),然后您的队列可以通过调查来优先处理它们正确的属性或方法集。
如果您的邮件进入速度太快,即使是最少的处理,您也可以使用两个队列系统。一个是未处理缓冲区的队列,下一个队列是从缓冲区构建的消息对象队列。
我希望这会有所帮助。
答案 1 :(得分:2)
为什么不接收消息,创建DeviceMessage(缺少更好的名称)对象,并将该对象放入队列?如果优先级很重要,请实现一个自动处理它的PriorityQueue类(通过将DeviceMessage对象插入队列时按优先级顺序放置)。看起来像是一种更为面向对象的方法,并且可以简化与优先级相关的维护。
答案 2 :(得分:2)
@grieve:网络是原生的,这意味着当缓冲区用于网络上的接收/发送数据时,它们被固定在内存中。请参阅下面的评论以进行详细说明。
答案 3 :(得分:2)
我知道这是一篇旧帖子,但我认为你应该看一下ILNumerics项目中实现的内存池。我认为他们完全符合您的需求,这是一段非常好的代码。 在http://ilnumerics.net/下载代码并查看文件ILMemoryPool.cs
答案 4 :(得分:1)
我正在做类似的事情。我有消息进入需要在STA线程上提供服务的MTA线程。
我使用了BlockingCollection(部分并行fx扩展),由多个STA线程监控(可配置,但默认为xr *核心数)。每个线程都尝试从队列中弹出一条消息。他们要么超时再试,要么成功弹出一条消息并为其提供服务。
我已将它连接到perfmon计数器以跟踪空闲时间,作业长度,传入消息等,这些可用于调整队列的设置。
您必须实现自定义集合,或者可能扩展BC,以实现队列项优先级。
我以这种方式实现它的原因之一是,据我所知,queueing theory通常偏爱单行,多服务器(为什么我觉得我会抓住那个垃圾?)。