如何在c#中处理队列数据

问题描述 投票:0回答:1

我有2个进程要与之通信。

其中一个是每5毫秒发送一次数据,其他进程是使用Queue每50毫秒接收一次数据。

当我开始发送数据时,由于间隔不同,我可以检查队列计数是否在增加。因此,即使我停止发送数据,接收过程仍在工作,因为队列仍在排队。

这是对象通信的代码:

public Lens[] GetNum()
{
    if (Queue.Count() < 1)
    {
        return null;
    }else 
    {
        var n = Queue.Dequeue();
        return n;
    }
}

我想以低延迟接收数据而不清除队列。我应该如何编辑代码?

c# queue communication
1个回答
0
投票

[如果可以的话,也许看看System.Threading.Channels.Channel<T>,这是一种优化的,线程安全的,类似于异步队列的机制,旨在为异步代码中的生产者/消费者交互而设计,所有选项都是有界/无界,激活等的,烤入。


回到同步世界:

首先,请注意Queue<T>not线程安全的;由于您正在使用多个线程,因此此处[[必须同步访问,最有可能使用lockMonitor)。

如果您的意思是

检查

轮询(计时器)上的队列,那么您可以通过在线程之间发信号来减少等待时间。例如,如果您要添加到一个空队列,则该工作程序可能正在等待,因此:脉冲它们// consumer lock (queue) { while (queue.Count == 0) { // relinquishes lock, and waits // for timeout or pulse Monitor.Wait(queue, timeout); } return queue.Dequeue(); // to be processed } // producer lock (queue) { queue.Enqueue(work); if (queue.Count == 1) { Monitor.Pulse(queue); } }
© www.soinside.com 2019 - 2024. All rights reserved.