2016-04-07 18 views
1

私は1つのスレッドで満たされているbyte []のリストを持っています。そして、そのリストから読み込み中の項目をネットワーク経由で送信している別のスレッドがあります。 enter image description hereリストからアイテムを削除するにはどうしたらいいですか?

メモリからクリアするためにthread2でアイテムを読み取るたびに、私はしたいです。しかし、私はスレッドを使用しているので、もし私が.removeを使うと、リストのインデックスを変更する必要があります。だから、私はリストのインデックスと激しくぶつかりません、私はちょうど私が使用している項目を変更していますnull。メモリ内のスペースを無駄にしないようにこれを行う最善の方法は何ですか?

+5

['ConcurrentQueue'](https://msdn.microsoft.com/en-US/library/dd267265(v=vs.110).aspx)を使用してみませんか? – sloth

答えて

4

代わりにConcurrentQueueを使用するように思えます。

ConcurrentQueueはスレッドセーフなファーストイン/ファーストアウトコレクションなので、最初のスレッドはEnqueueでアイテムをキューにプッシュし、2番目のスレッドはTryDequeueでキューからアイテムを読み込もうとします。

+0

'TryDeQueue'を使用して正常に読み込むと、それはキューから消去されますか? – meme

+0

@memeはい。 TryDequeueは、並行キューの先頭にあるオブジェクトを削除して返します。 – sloth

+0

ありがとうございました。それはトンを助けた。 :) – meme

2

質問によれば、クリティカルセクション(別名lock)の割り当てのように聞こえます。通常、消費者/プロデューサーのためにあなたがConcurrentQueueを使用したい

object lockList = new object(); 

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

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

注:

lock下の読み取り/書き込みロックオブジェクトを作成し、実行します。

関連する問題