Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 基本QoS算法?_C#_Queue_Qos - Fatal编程技术网

C# 基本QoS算法?

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发送这样的数据包:

    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;
    }

    // ...
}