我有2个进程要与之通信。
其中一个是每5毫秒发送一次数据,其他进程是使用Queue每50毫秒接收一次数据。
当我开始发送数据时,由于间隔不同,我可以检查队列计数是否在增加。因此,即使我停止发送数据,接收过程仍在工作,因为队列仍在排队。
这是对象通信的代码:
public Lens[] GetNum()
{
if (Queue.Count() < 1)
{
return null;
}else
{
var n = Queue.Dequeue();
return n;
}
}
我想以低延迟接收数据而不清除队列。我应该如何编辑代码?
[如果可以的话,也许看看System.Threading.Channels.Channel<T>
,这是一种优化的,线程安全的,类似于异步队列的机制,旨在为异步代码中的生产者/消费者交互而设计,所有选项都是有界/无界,激活等的,烤入。
回到同步世界:
首先,请注意Queue<T>
是not线程安全的;由于您正在使用多个线程,因此此处[[必须同步访问,最有可能使用lock
(Monitor
)。
检查
轮询(计时器)上的队列,那么您可以通过在线程之间发信号来减少等待时间。例如,如果您要添加到一个空队列,则该工作程序可能正在等待,因此:脉冲它们:// 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);
}
}