2014-02-15 137 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>或實現自己的鎖定,您也可能得不到預期的結果。