使用C#缓冲池管理使用C#
我们需要为使用C#开发的应用程序开发某种缓冲区管理。使用C#缓冲池管理使用C#
本质上,应用程序接收来自设备的消息时,它们进来时(在短时间内可能会有很多)。我们需要将它们排列在某种缓冲池中,以便我们可以以可管理的方式处理它们。
我们正在考虑在256字节的块中分配一块内存(所有的信息都小于这个值),然后使用缓冲池管理来获得可用于传入消息的缓冲池和缓冲池准备好被处理。因此,流程将是“获取缓冲区”(处理它)“释放缓冲区”或“将其留在池中”。我们还需要知道缓冲区何时填满。
可能,我们还需要一种方法来“窥探”缓冲区,以查看池中最高优先级的缓冲区,而不是总是获取下一个缓冲区。
在.NET中是否已经支持这个或者是否有一些我们可以使用的开源代码?
C#锐利的内存管理实际上是相当不错的,所以你可以只分配你需要的东西,并将它粘贴到一个队列中。一旦你完成缓冲区,就让垃圾收集器处理它。
另一个选项(只知道你的应用程序很少),就是在获取它们时尽可能少地处理这些消息,并将它们变成完全成熟的对象(具有优先级和全部),然后你的队列可以仅仅通过优先级调查正确的一组属性或方法。
如果即使进行最低限度的处理,您的消息速度过快,也可能有两个队列系统。一个是未处理的缓冲区队列,下一个队列是由缓冲区构建的消息对象队列。
我希望这会有所帮助。
为什么你不只是收到消息,创建一个DeviceMessage(缺乏一个更好的名称)对象,并将该对象放入队列?如果优先级重要,请实现一个PriorityQueue类,该类可以自动处理该类(通过将DeviceMessage对象插入队列时按优先级顺序排列)。看起来像更多的面向对象的方法,并且会在优先级划分方面随着时间的推移简化维护。
我正在做类似的事情。我有需要在STA线程上提供服务的MTA线程上的消息。
我用了一个BlockingCollection(部分并行fx扩展),它由多个STA线程监控(可配置,但默认为xr *核心数)。每个线程都尝试从队列中弹出消息。他们要么超时,再试一次,要么成功弹出消息并提供服务。
我得到它与perfmon计数器连接,以跟踪空闲时间,工作长度,传入消息等,这可以用来调整队列的设置。
您必须实现自定义集合,或者扩展BC以实现队列项优先级。
我以这种方式实现它的原因之一是,据我所知,queueing theory通常倾向于单线,多服务器(为什么我觉得我会抓住那个废话?)。
@ grieve:网络是本地的,这意味着当使用缓冲区在网络上接收/发送数据时,它们被固定在内存中。请参阅下面的评论以供阐述。
我知道这是一个旧帖子,但我认为你应该看看在ILNumerics项目中实现的内存池。我认为他们确实做了你需要的东西,这是一段非常好的代码。 在http://ilnumerics.net/处下载代码并查看文件ILMemoryPool.cs
不是一个好主意。任何与interop无关的事情都会导致碎片化(并导致内存不足例外),这是由于GC不得不锁定对象。 – 2009-01-22 06:13:53
Interop之间是什么?主题?应用程序?流程? – grieve 2009-01-25 20:03:46
我认为nzpcmad正在使用纯管理的w/o P/Invoke。 – user7116 2009-12-04 22:06:24