首页 > 解决方案 > 如何在c#中处理队列数据

问题描述

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

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

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

这是对象通信的代码:

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

我想在不清除队列的情况下以低延迟接收数据。我应该编辑什么代码?

标签: c#queuecommunication

解决方案


不清除队列

不知道你的意思是什么,所以我基本上忽略了它;队列的全部意义在于清除它;因为队列是先进先出的,如果你不清除它,你总是在处理同一个项目。


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


回到同步世界:

首先,请注意这不是Queue<T>线程安全的;由于您使用的是多个线程,因此这里必须同步访问,很可能使用( )。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);
    }
}

推荐阅读