2014-02-15 144 views
0

我有一个字典是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#-caused一个内存管理问题)

EDIT1:是的没有一个线程安全的FPGA实现,但我已经尝试过'lock()',并且不起作用!

编辑2:哦另一个重要的编辑。我在Unity中使用C#2.0。所以解决方案应该是一个C#2.0(单声道)代码:/

+0

你在哪里看到“损坏”的值?在'_Process'方法中?如果你只排队和处理一个单一的数据包,它是否有效? (我认为这可以排除多线程问题来确定损坏的原因。) – richaux

+0

另外,您在什么时候从'_Packets'集合中删除发送的数据包? ...并且是传递给具有任何意义的“_Process”的数据包? – richaux

回答

0

看起来你可能想用这种操作的队列,它更适合你正在尝试做的事情。

如果遇到并发问题,可以使用ConcurrentQueue类。

+1

它必须是字典,因为我需要使用ID键查找我的值。 – PilawyerDev

+1

在您的示例中,您正在迭代keyValuePair并仅发送值 - 请更新代码并提供有关如何使用字典以获取更好建议的相关详细信息! – Andrea

0

您不必使用锁来保证线程安全。只需使用ConcurrentDictionary来代替常规字典。

+0

它的工作原理,但这不是我寻找的解决方案,因为C#2.0 :) – PilawyerDev

0

A Dictionary<TKey, TValue>不是线程安全的,因此您的多线程示例中的行为未定义。此外,在迭代Dictionary<TKey, TValue>时返回项目的顺序未定义,因此即使使用ConcurrentDictionary<TKey, TValue>或实现自己的锁定,您也可能得不到预期的结果。