我有一个连续循环从ConcurrentQueue发送这样的数据包:
ConcurrentQueue<packet> queue = new ConcurrentQueue<packet>();
while(true){
packet data;
if (!queue.TryPeek(out packet)) continue;
send(data);
queue.TryDequeue(out data); //remove sent packet from the queue
}
特定端口上的每个数据包都具有指定的优先级(空,低,中,高)等。
public struct packet
{
public byte[] data;
public uint Length;
public address addr;
public string priority;
}
我可以使用哪种算法先发送高优先级数据包而不阻塞队列中的其他数据包?
示例:
while(true){
packet data;
if (!queue.TryPeek(out packet)) continue;
foreach(packet x in queue)
{
if(x.priority == "high")
{
send(data);
queue.TryDequeue(out data);
}
}
send(data);
queue.TryDequeue(out data);
}
示例不起作用,因为只发送和删除队列中的第一个数据包。 我不确定这是否是正确的方法。
答案 0 :(得分:2)
我认为你击球时会使用4个不同的队列。每个优先级的一个队列。类似的东西:
while(true){
packet data;
if (highPriorityQ.TryDequeue(out data))
{
send(data);
continue;
}
if (mediumPriorityQ.TryDequeue(out data))
{
send(data);
continue;
}
// ...
}
只是一些建议:直接使用TryDequeue
,您可能会遇到TryPeek
和TryDequeue
之间的僵局。另外,尽量避免使用While(true)
。请参阅此问题Is it safe to put TryDequeue in a while loop?