如何在没有.remove的情况下从列表中“删除”项目?

时间:2016-04-07 16:45:31

标签: c#

我有一个由一个线程填充的byte []列表,然后我有另一个线程从该列表中读取并通过网络发送这些项目。enter image description here

我想每次读取thread2中的项目以从内存中清除它。但是因为我正在使用线程,如果我使用.remove,我将不得不处理更改列表的索引,并且在我这样做时不让thread1写入它。所以,所以我不与列表的索引进行交互,我只是将我使用的项目更改为 null 。这样做的最佳方法是什么,以免浪费内存空间?

2 个答案:

答案 0 :(得分:4)

听起来你想要使用ConcurrentQueue

ConcurrentQueue是一个线程安全的先进/先出集合,因此第一个线程会将项目推送到队列Enqueue,而第二个线程会尝试从中读取项目排队TryDequeue

答案 1 :(得分: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