我有一个php脚本,每秒都会向我的服务器发送一个UDP数据包。
一个C#程序,它监听UDP数据包,然后使用datagridview显示它们。 为此,我生成了两个线程,一个是一直监听,另一个是处理数据。他们使用ConcurrentQueue,listen方法将数据排入队列,处理器方法将其出列,并在datagridview上显示它。
private void btnStart_Click(object sender, EventArgs e)
{
threadUdp = new Thread(Listener);
threadUdp.Start();
threadProcessor = new Thread(startPacketProcessor);
threadProcessor.Start();
this.btnStart.Enabled = false;
}
void Listener()
{
while (true)
{
receivedBytes = listener.Receive(ref sender);
Packet packetData = new Packet(sender, receiver, receivedBytes);
_queue.Enqueue(packetData);
}
}
private void startPacketProcessor()
{
int i = 0;
Packet packet;
while (true)
{
var ok = _queue.TryDequeue(out packet);
if (ok)
{
string data = GetHexStringFrom(packet.ReceivedBytes);
string[] row = new string[] { System.DateTime.Now.ToString(), packet.FIP, packet.FPort, packet.TIP, packet.TPort, data, "", i++.ToString() };
this.dataGridViewPackets.Invoke((MethodInvoker)delegate { this.dataGridViewPackets.Rows.Add(row); });
if (this.dataGridViewPackets.RowCount >= 100)
{
this.dataGridViewPackets.Invoke((MethodInvoker)delegate { this.dataGridViewPackets.Rows.RemoveAt(0); });
}
}
}
}
我注意到这个程序在php脚本停止执行后很长时间不断向datagridview添加数据包,即使我停止c#调试然后再次启动程序,新数据仍然被添加到datagridview而不再执行php脚本...
我担心这会导致内存泄漏,我不知道为什么会发生这种情况...... 可能是我正在更快地读取数据然后我可以处理它并且ConcurrentQueue甚至在我停止调试器之后存储它?如果是这样,我怎么能在丢失信息之前限制ConcurrentQueue可以存储的对象数量?如果我不限制它,如果有足够的数据包排队,它会导致内存泄漏吗? 或者可能是操作系统对UDP数据包进行排队,如果是,我该如何检查操作系统排队的数据包数量?