2015-01-01 45 views
1

當我的機器負載過重時,我的線程代碼出現錯誤。當機器輕載時不會發生錯誤。我使用VS 2013,C#5.0和.NET 4.51。在線程代碼中複製列表時出錯

代碼如下:

private static readonly Object lockGetData = new Object(); 

public static void GetData(string symbol, out List<Tuple<double, double>> velocityLine) 
{ 
    try 
    { 
     lock (lockGetData) 
     { 
     mData = mSymbols[symbol]; 
     Debug.Assert(mData != null, "Oh crap! mData is null"); 
     velocityLine = new List<Tuple<double, double>>(mData.velocityLine); 
     return; 
     } 
    } 
    catch (Exception ex) 
    { 
     DebugPrint("GetData error.\n" + ex.Message, symbol); 
     velocityLine = new List<Tuple<double, double>>(); 
     return 0.0; 
    } 
} 

我上線得到一個錯誤:

velocityLine = new List<Tuple<double, double>>(mData.velocityLine); 

的錯誤消息是:「目標數組不夠長檢查destindex和長度,和數組的下限。「

當發生錯誤,並且當我檢查「velocityLine」的長度時,它是空的。

我不明白爲什麼我得到這個錯誤。任何幫助或建議將不勝感激。

查爾斯

+2

長度不能爲空......但是你是否在其他線程中修改了'mData.velocityLine'? '列表'不是線程安全的。 –

+0

調查['BlockingCollection'](http://msdn.microsoft.com/en-us/library/dd267312%28v=vs.100%29.aspx)這是線程安全的 – grabthefish

+0

此外,你不能返回'0.0 'void method' –

回答

2

如果沒有一個完整的代碼示例,目前還不清楚是如何被使用的mData集合對象。但是鑑於這個錯誤,實際上可以肯定的是,在執行構造函數時某個其他線程正在修改該對象,結果是該集合的長度在構造函數使用其長度初始化支持數組的時間之間發生變化,然後嘗試將所有元素從mData對象複製到後備陣列。

這是不足以同步velocityLine對象。您還必須同步對用於初始化它的對象的任何訪問權限。

最後,我會注意到這裏的try/catch (Exception)子句在這裏是非常糟糕的形式(假設你的版本實際上有一個有效的return聲明,而不是這裏發佈的內容)。如果你把它放在那裏只是爲了調試這段代碼,那很好......但是現在你知道什麼是錯的,你應該刪除它。這將確保如果有任何其他錯誤,你不得不修改它們而不是神祕的程序,只是做一些不同於你隨機想要的東西。

+0

謝謝彼得。我給另一個也訪問「mData」的例程添加了一個鎖,這似乎解決了這個問題。 – user274610