C# 基本QoS算法?
我有一个连续循环,从ConcurrentQueue发送这样的数据包:C# 基本QoS算法?,c#,queue,qos,C#,Queue,Qos,我有一个连续循环,从ConcurrentQueue发送这样的数据包: ConcurrentQueue<packet> queue = new ConcurrentQueue<packet>(); while(true){ packet data; if (!queue.TryPeek(out packet)) continue; send(data); queue.TryDequeue(ou
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
}
我可以使用哪种算法首先发送高优先级数据包,而不阻塞队列中的其他数据包
例如:
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);
}
示例将不起作用,因为只有队列中的第一个数据包被发送和删除。
我不确定这是否是正确的方法。我认为您最好使用4种不同的队列。每个优先级对应一个队列。比如:
while(true){
packet data;
if (highPriorityQ.TryDequeue(out data))
{
send(data);
continue;
}
if (mediumPriorityQ.TryDequeue(out data))
{
send(data);
continue;
}
// ...
}
只是一些建议:直接使用
TryDequeue
,您可能会在TryPeek
和TryDequeue
之间遇到死锁。另外,尽量避免而(true)
。看到这个问题你能解释一下如何直接使用TryDequeue
吗?我已经阅读了提供的堆栈链接,但我不知道问题出在哪里。如果(highPriorityQ.IsEmpty)继续,我检查以确保队列不为空,并使用
在TryDequeue
之前,这是否可以防止死锁?我的意思是,不要调用TryPeek
,而在调用TryDequeue
一段时间后,直接调用TryDequeue
会更好,因为即使队列为空TryDequeue
也不会引发异常
while(true){
packet data;
if (highPriorityQ.TryDequeue(out data))
{
send(data);
continue;
}
if (mediumPriorityQ.TryDequeue(out data))
{
send(data);
continue;
}
// ...
}