我有一个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(单声道)代码:/
答案 0 :(得分:0)
看起来您可能希望使用队列进行此类操作,它更适合您尝试的操作。
如果遇到并发问题,可以使用ConcurrentQueue类。
答案 1 :(得分:0)
您不必使用锁来保证线程安全。只需使用ConcurrentDictionary
代替常规字典。
答案 2 :(得分:0)
Dictionary<TKey, TValue>
不是线程安全的,因此在多线程示例中未定义行为。此外,迭代Dictionary<TKey, TValue>
时返回项目的顺序是未定义的,因此即使您使用ConcurrentDictionary<TKey, TValue>
或实现自己的锁定,也可能无法得到预期的结果。
答案 3 :(得分:0)
真正的解决方案(我尝试过并且有效)是l3arnon's answer但是我要在C#2.0中实现这个系统,我已经像this method一样实现了Monitor }。