MultiThreaded应用程序中的字典(内存管理?)

时间:2014-02-15 15:25:22

标签: c# multithreading pointers memory-management dictionary

我有一个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(单声道)代码:/

4 个答案:

答案 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 }。