c# - 如何在c#中处理队列数据
问题描述
我有 2 个进程要与之通信。
其中一个是每 5 毫秒发送一次数据,另一个进程是使用队列每 50 毫秒接收一次数据。
当我开始发送数据时,我可以检查队列计数是否因为间隔的差异而增加。因此,即使我停止发送数据,接收过程仍在工作,因为队列仍在排队。
这是对象通信的代码:
public Lens[] GetNum()
{
if (Queue.Count() < 1)
{
return null;
}else
{
var n = Queue.Dequeue();
return n;
}
}
我想在不清除队列的情况下以低延迟接收数据。我应该编辑什么代码?
解决方案
不清除队列
不知道你的意思是什么,所以我基本上忽略了它;队列的全部意义在于清除它;因为队列是先进先出的,如果你不清除它,你总是在处理同一个项目。
如果可以的话,也许可以看一下System.Threading.Channels.Channel<T>
,这是一种优化的、线程安全的、类似队列的异步机制,专为异步代码中的生产者/消费者交互而设计,所有选项都是有界/无界、激活等。
回到同步世界:
首先,请注意这不是Queue<T>
线程安全的;由于您使用的是多个线程,因此这里必须同步访问,很可能使用( )。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);
}
}
推荐阅读
- php - 将自定义元数据合并到 laravel 中的分页响应
- python - 人脸对齐megaface
- javascript - 当我提交表单且未插入数据库时,Bootstrap 模态框未提交表单数据
- node.js - 通过 npm 安装 tensorflow.js 时面临的问题
- c# - 用 C# 代替 Python 的 Blender
- ruby-on-rails - 如何更新rails db记录
- jquery - 我想从 api 搜索数据并显示其结果
- php - 我如何检查注册的电子邮件 ID 是否可以访问我的应用程序?
- c# - 将值从 c# 绑定到返回 NaN 的 html?
- r - 在 R 中检索 Stata 变量注释