2016-04-07 226 views
1

我有一個由一個線程填充的字節[]的列表,然後我有另一個線程正在讀取該列表並通過網絡發送項目。 enter image description here如何從列表中刪除項目而不刪除.remove?

我希望每次讀取thread2中的一個項目以從內存中清除它。但是,因爲我使用線程,如果我使用.remove我將不得不處理更改列表的索引,並且不讓thread1寫入它,而我這樣做。所以,所以我不與列表的索引交火,我只是改變我使用的項目null。這樣做的最佳方式是什麼,以避免浪費內存空間?

+5

爲什麼不使用['ConcurrentQueue'](https://msdn.microsoft.com/en-US/library/dd267265(v = vs.110).aspx)? – sloth

回答

4

這聽起來像是你想用ConcurrentQueue來代替。

A ConcurrentQueue是線程安全的先入先出集合,所以第一個線程將Enqueue推送到隊列中,而第二個線程將嘗試使用TryDequeue讀取該隊列中的項目。

+0

當我使用'TryDeQueue'並且它讀取成功時,它是否從隊列中清除它? – meme

+0

@meme是的。 TryDequeue嘗試刪除並返回併發隊列開始處的對象。 – sloth

+0

謝謝你的回答。它幫助了一噸。 :) – meme

2

根據問題,這聽起來像是關鍵部分的分配(又名lock)。

創建鎖定對象,並執行讀lock下/寫:

object lockList = new object(); 

byte ReadFromList(int index) 
{ 
    lock(lockList) { return theList[index]; } 
} 

void RemoveFromList(int index) 
{ 
    lock(lockList) { theList.Remove(index); } 
} 

注意,通常是生產者/消費者你會使用ConcurrentQueue