【发布时间】:2014-03-15 00:06:00
【问题描述】:
我有一个字典,它是Dictionary<int, RSendPacket> _Packets,并且有两个主线程。线程 #1 使用此函数添加数据包
public void EnqueueOutgoingData(int id, byte[] data)
{
RSendPacket packet = new RSendPacket(data);
_Packets.Add(id, packet);
}
线程#2 像这样通过套接字读取和发送数据包
private void _Process(RSendPacket packet)
{
foreach (KeyValuePair<int, RSendPacket> o in _Packets)
{
//Socket send (o.Value >> That's RSendPacket class)
}
}
此时,我遇到了一个错误。我正在添加“asdf”,但它带有“► o”。我认为这是一个线程/内存错误,但我无法修复它,因为我不知道如何解决!有人可以帮我解决这个问题吗? (我可以用 C++ 实现一个带有指针和内存管理的系统,这应该是一个内存管理问题 - 由我糟糕的 c# 引起)
EDIT1: 是的,没有线程安全的实现,但我已经用 'lock()' 尝试过,但不起作用!
EDIT2:哦,另一个重要的编辑。我在 Unity 中使用 C# 2.0。所以解决方案应该是 C# 2.0 (mono) 代码:/
【问题讨论】:
-
您在哪里看到“损坏”的值?在
_Process方法中?如果您只排队和处理一个数据包,那行得通吗? (我认为这将在确定损坏原因时排除多线程问题。) -
另外,什么时候从
_Packets集合中删除发送的数据包? ...并且传递给_Process的packet有什么意义吗?
标签: c# multithreading pointers memory-management dictionary