我们的应用程序是基于客户端服务器的应用程序,我已将其从.NET远程处理转换为ZMQ。我们有两种情况,其中大图像对象被转换为字节数组,以便被序列化并发送到客户端。为了减少内存问题(Large Object Heap),我们有一个用于此过程的字节数组池,从而不再分配和释放它们。
我遇到的问题是,在类似RMI的调用中返回数组后,我不知道如何在池中将字节数组标记为“free”。
public byte[] GetImageAreaGrey(int imageId)
{
var image = FindImageById(imageId);
byte[] byteHolder = BytePool.GetFreeArray();
ByteConverter.ConvertImageToBytes(image, byteHolder)
return byteHolder ; // byteHolder will be serialized in the communications code using JSON.NET
// How do I return byteHolder to the pool so that is available for future use?
}
应用程序是用C#编写的.NET 4.5运行时,我们正在尝试防止大对象堆碎片化。
编辑:澄清原始字节[]正在返回。
答案 0 :(得分:-2)
旧答案:池必须跟踪哪些阵列是空闲的,哪些是使用的。您需要针对免费和非免费阵列的单独集合。这是任何游泳池的基本要求,所以我不确定你在说什么样的游泳池。
新答案:阅读评论后,我更好地理解了这个问题。您希望将一个字节数组返回到池中,但是字节数组已作为返回值返回给由外部代码调用的方法。这是个问题吗?您无法将其返回到池中,因为您不知道外部代码何时完成字节数组。你不能使用游泳池。
要使用池,您必须反转控制顺序。您的代码必须使用字节数组作为输入参数来调用外部代码。