2012-09-21 141 views
0

我有一個數組列表,每秒不斷更新。我必須在其他兩個線程中使用相同的數組列表並對其進行本地複製。我已經完成了所有這些,但我得到了奇怪的索引超出限制的例外,到目前爲止我發現的是,我必須確保一些同步機制的數組列表跨越多個線程使用。Arraylist同步問題

這是怎麼了我正在使其同步:

for (int i = 0; i < Globls.iterationCount; i++) 
      { 
       if (bw_Obj.CancellationPending) 
       { 
        eve.Cancel = true; 
        break; 
       } 

       byte[] rawData4 = DMM4.IO.Read(4 * numReadings); 
       TempDisplayData_DMM4.Add(rawData4); 
       Globls.Display_DataDMM4 = ArrayList.Synchronized(TempDisplayData_DMM4); 
       Globls.Write_DataDMM4 = ArrayList.Synchronized(TempDisplayData_DMM4); 

      } 
在其他線程

我這樣做,使本地副本:

ArrayList Local_Write_DMM4 = new ArrayList(); 
Local_Write_DMM4 = new ArrayList(Globls.Write_DataDMM4); 

我是同步在正確的方式ArrayList的?還我是否需要在複製陣列列表的同時鎖定:

lock (Globls.Display_DataDMM4.SyncRoot){Local_Temp_Display1 = new ArrayList(Globls.Display_DataDMM4);} 

或單個操作其安全嗎?我沒有真正跑過這段代碼,我需要在週末運行它,我不想看到另一個例外:(請幫助我!

+0

你能解釋一下你的目標是什麼?避免這種例外是次要的。你是否擔心包含不同內容的列表的兩個線程?或擔心一個線程可能會更改列表項目,而另一個線程正在閱讀? – chris

+0

解決您的問題:[鏈接](http://stackoverflow.com/questions/1813557/c-sharp-list-concurrent-removing-and-adding) – Artless

+0

@chris arraylist從來沒有不同的內容。我試圖在複製時避免異常Local_Write_DMM4 = new ArrayList(Globls.Write_DataDMM4);我用上面的方法,我問了兩個問題,這是我主要關心的問題 – user1514077

回答

2

爲@Trickery規定分配需要被鎖定,因爲源陣列Globls.Write_DataDMM4可以被另一個線程修改。枚舉期間 因此,在填寫原始數組時,必須同時鎖定以使其複製

for (int i = 0; i < Globls.iterationCount; i++) 
{ 
    if (bw_Obj.CancellationPending) 
    { 
     eve.Cancel = true; 
     break; 
    } 

    byte[] rawData4 = DMM4.IO.Read(4 * numReadings); 
    TempDisplayData_DMM4.Add(rawData4); 

    lock (Globls.Display_DataDMM4.SyncRoot) 
    { 
    Globls.Write_DataDMM4 = ArrayList.Synchronized(TempDisplayData_DMM4); 
    } 

} 

lock (Globls.Display_DataDMM4.SyncRoot) 
{ 
    Local_Temp_Display1 = new ArrayList(Globls.Display_DataDMM4); 
} 
+0

如果我不做任務,該怎麼辦:Globls.Write_DataDMM4 = ArrayList.Synchronized(TempDisplayData_DMM4);而不是我初始化公共靜態數組列表Write_DataDMM4 = ArrayList.Synchronized(new ArrayList());我只是添加到列表Globls.Display_DataDMM4.Add(rawData); ,我已經同步arraylist開始,我正在添加數據,需要鎖定以及? – user1514077

+0

'public static'聲明可能是一個好主意,但是你仍然需要在'.Add()'階段鎖定。見[這篇文章](http://blogs.technet.com/b/efleis/archive/2006/06/01/431698.aspx) – chris

+0

那麼文章提到做添加/刪除不會損壞列表,我跑一個70小時的測試沒有鎖定添加,它不會造成任何問題,謝謝! – user1514077

1

是的,ArrayList上的所有操作都需要使用Lock 。

編輯:對不起,該網站不會讓我評論添加到您由於某種原因,問題