gpt4 book ai didi

c# - 监控队列的状态

转载 作者:行者123 更新时间:2023-11-30 14:37:29 25 4
gpt4 key购买 nike

给定一个 Queue<MyMessage> , 其中MyMessage是某些消息类型的基类:所有消息类型都有不同的字段,因此它们将使用不同的字节数。因此,根据字节而不是队列中存在的元素来衡量此队列的填充级别是有意义的。事实上,由于这个队列与一个连接相关联,我可以更好地控制消息流,在队列快满时减少流量。

为了获得这个目标,我想包装一个简单的 Queue使用自定义类 MyQueue .

public class MyQueue
{
private Queue<MyMessage> _outputQueue;
private Int32 _byteCapacity;
private Int32 _currentSize; // number of used bytes

public MyQueue(int byteCapacity)
{
this._outputQueue = new Queue<MyMessage>();
this._byteCapacity = byteCapacity;
this._currentSize = 0;
}

public void Enqueue(MyMessage msg)
{
this._outputQueue.Enqueue(msg);
this._currentSize += Marshal.SizeOf(msg.GetType());
}

public MyMessage Dequeue()
{
MyMessage result = this._outputQueue.Dequeue();
this._currentSize -= Marshal.SizeOf(result.GetType());
return result;
}
}

问题是这对类不好,因为Marshal.SizeOf抛出 ArgumentException异常。

  1. 是否有可能以某种方式计算对象(类的实例)的大小?
  2. 是否有一些替代方法可以根据字节监控队列的填充水平?
  3. 有没有可以用这种方式管理的队列?

更新:作为替代解决方案,我可以添加一个方法 int SizeBytes()在每种消息类型上,但是这个解决方案看起来有点难看,尽管它可能是最有效的,因为您不能轻易地测量引用类型

public interface MyMessage
{
Guid Identifier
{
get;
set;
}

int SizeBytes();
}

实现这个接口(interface)的类除了实现SizeBytes()之外还必须方法,同时实现一个 Identifier属性(property)。

public class ExampleMessage
{
public Guid Identifier { get; set; } // so I have a field and its Identifier property
public String Request { get; set; }

public int SizeBytes()
{
return (Marshal.SizeOf(Identifier)); // return 16
}
}

sizeof运算符不能与 Guid 一起使用因为它没有预定义的大小,所以我使用 Marshal.SizeOf() .但在这一点上,也许我应该使用实验确定的值 :例如,因为 Marshal.SizeOf()对于 Guid 返回 16自从 string由 N char 组成, 然后是 SizeBytes()方法可以如下:

public int SizeBytes()
{
return (16 + Request.Length * sizeof(char));
}

最佳答案

如果您可以使用虚拟方法 SizeOf() 编辑 MyMessage 基类,那么您可以让消息类在其原始类型上使用 c# sizeof 运算符。 如果您能做到这一点,您的其余代码就是黄金。

关于c# - 监控队列的状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9217219/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com