6

我们需要为使用 C# 开发的应用程序开发某种缓冲区管理。

本质上,应用程序会在设备进入时接收来自设备的消息(短时间内可能会有很多消息)。我们需要将它们排在某种缓冲池中,以便我们可以以托管方式处理它们。

我们正在考虑以 256 字节的块分配一块内存(所有消息都小于这个值),然后使用缓冲池管理来拥有一个可用于传入消息的可用缓冲区池和一个准备好处理的缓冲区池.

因此流程将是“获取缓冲区”(处理它)“释放缓冲区”或“将其留在池中”。我们还需要知道缓冲区何时填满。

潜在地,我们还需要一种“窥视”缓冲区的方法,以查看池中最高优先级的缓冲区是什么,而不是总是获取下一个缓冲区。

.NET 中是否已经对此提供了支持,或者是否有一些我们可以使用的开源代码?

4

5 回答 5

4

C#sharps 内存管理实际上非常好,因此您可以准确地分配所需的内容并将其放入队列中,而不是使用缓冲区池。一旦你完成了缓冲区,就让垃圾收集器处理它。

另一种选择(对您的应用程序知之甚少)是在收到消息时对它们进行最低限度的处理,并将它们变成完整的对象(具有优先级和所有),然后您的队列可以通过调查正确的集合来确定它们的优先级属性或方法。

如果您的消息来得太快,即使处理最少,您也可以使用两个队列系统。一个只是未处理缓冲区的队列,下一个队列是从缓冲区构建的消息对象队列。

我希望这有帮助。

于 2008-11-11T19:48:13.647 回答
2

为什么不直接接收消息,创建一个 DeviceMessage(因为没有更好的名称)对象,然后将该对象放入 Queue 中?如果优先级很重要,请实现一个自动处理的 PriorityQueue 类(通过在将 DeviceMessage 对象插入队列时按优先级顺序放置它们)。看起来更像是一种面向对象的方法,并且会随着时间的推移简化关于优先级的维护。

于 2008-11-11T19:49:24.640 回答
2

@grieve:网络是原生的,这意味着当使用缓冲区接收/发送网络上的数据时,它们被固定在内存中。请参阅下面的评论以进行详细说明。

于 2009-12-04T21:58:01.353 回答
2

我知道这是一篇旧帖子,但我认为您应该看看 ILNumerics 项目中实现的内存池。我认为他们完全符合您的需要,这是一段非常好的代码。在http://ilnumerics.net/下载代码并查看文件 ILMemoryPool.cs

于 2011-09-10T23:18:03.907 回答
1

我正在做类似的事情。我收到需要在 STA 线程上处理的 MTA 线程上的消息。

我使用了一个BlockingCollection(并行 fx 扩展的一部分),它由多个 STA 线程(可配置,但默认为 xr * 核心数)监控。每个线程都试图从队列中弹出一条消息。他们要么超时并重试,要么成功弹出消息并提供服务。

我已经将它与 perfmon 计数器连接,以跟踪空闲时间、作业长度、传入消息等,可用于调整队列的设置。

您必须实现自定义集合,或者扩展 BC,以实现队列项目优先级。

我以这种方式实现它的原因之一是,据我了解,排队理论通常有利于单线、多服务器(为什么我觉得我会对此胡说八道?)。

于 2008-11-11T21:14:00.197 回答