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

C# 如何在c语言中处理队列数据#,c#,queue,communication,C#,Queue,Communication,我有两个流程需要沟通 其中一个进程每5毫秒发送一次数据,另一个进程使用队列每50毫秒接收一次数据 当我开始发送数据时,我可以检查队列计数是否在增加,因为间隔之间的差异。因此,即使我停止发送数据,接收进程仍在工作,因为队列仍在排队 以下是对象通信的代码: public Lens[] GetNum() { if (Queue.Count() < 1) { return null; }else { var n = Queue.De

我有两个流程需要沟通

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

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

以下是对象通信的代码:

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

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

没有清除队列

我不知道你说的是什么意思,所以我基本上忽略了它;队列的整个要点是清除它;由于队列是FIFO,如果您不清除它,您总是在处理相同的项目


如果可以的话,可以看看
System.Threading.Channels.Channel
,它是一种优化的、线程安全的、异步队列式的机制,设计用于异步代码中的生产者/消费者交互,具有所有重新绑定/未绑定、激活等选项


回到同步世界:

首先,请注意,
队列
不是线程安全的;由于您使用的是多个线程,因此必须在此处同步访问,最有可能的是使用
监视器

如果您的意思是在轮询(计时器)上检查队列,那么可以通过在线程之间发送信号来减少延迟。例如,如果要添加到一个空队列中,则工作人员可能正在等待,因此:pulse them:

//消费者
锁(队列)
{
while(queue.Count==0)
{//放弃锁,并等待
//超时或脉冲
Monitor.Wait(队列、超时);
}
return queue.Dequeue();//待处理
}
//制作人
锁(队列)
{
排队。排队(工作);
如果(queue.Count==1)
{
监测脉冲(队列);
}
}
没有清除队列

我不知道你说的是什么意思,所以我基本上忽略了它;队列的整个要点是清除它;由于队列是FIFO,如果您不清除它,您总是在处理相同的项目


如果可以的话,可以看看
System.Threading.Channels.Channel
,它是一种优化的、线程安全的、异步队列式的机制,设计用于异步代码中的生产者/消费者交互,具有所有重新绑定/未绑定、激活等选项


回到同步世界:

首先,请注意,
队列
不是线程安全的;由于您使用的是多个线程,因此必须在此处同步访问,最有可能的是使用
监视器

如果您的意思是在轮询(计时器)上检查队列,那么可以通过在线程之间发送信号来减少延迟。例如,如果要添加到一个空队列中,则工作人员可能正在等待,因此:pulse them:

//消费者
锁(队列)
{
while(queue.Count==0)
{//放弃锁,并等待
//超时或脉冲
Monitor.Wait(队列、超时);
}
return queue.Dequeue();//待处理
}
//制作人
锁(队列)
{
排队。排队(工作);
如果(queue.Count==1)
{
监测脉冲(队列);
}
}

有一个函数返回第一个对象而不将其退出队列。但是,为什么不希望您的队列清空呢?它最终会填满很多东西RAM@MindSwipe如果我确实清除了队列,可以在var n=queue.Dequeue()和return n之间添加一个代码'queue.clear()'吗?“我希望在不清除队列的情况下以低延迟接收数据。”这毫无意义。正在使用的队列数据将清除它。“如果你不吃它,为什么要推它呢?”雅各布,但你为什么要这样做呢?“出列”将删除它返回的对象-如果调用“清除”,则将丢弃队列中未处理的任何其他对象。这是返回第一个对象而不将其出列的对象。但是,为什么不希望您的队列清空呢?它最终会填满很多东西RAM@MindSwipe如果我确实清除了队列,可以在var n=queue.Dequeue()和return n之间添加一个代码'queue.clear()'吗?“我希望在不清除队列的情况下以低延迟接收数据。”这毫无意义。正在使用的队列数据将清除它。“如果你不吃它,为什么要推它呢?”雅各布,但你为什么要这样做呢?“出列”将删除它返回的内容-如果调用“清除”,您将丢弃队列中未处理的任何其他内容队列不是后进先出,它们是先进先出,但您对“如果不清除,您始终在处理同一项”的描述对于先进先出是正确的,但对于后进先出数据结构则不正确(假设为后进先出结构生成数据的任何东西都在不断生成数据)@MindSwipe-doh,brain-fart在那里一秒钟;我的意思是FIFOQueues不是后进先出,它们是先进先出,但你对“如果你不清除它,你总是在处理同一个项目”的描述对先进先出是正确的,但对后进先出数据结构来说不是(假设为后进先出结构生成数据的任何东西都在不断生成数据)@MindSwipe-doh,brain在那里放屁一秒钟;我指的是先进先出