2016-04-07 4 views
1

Ich habe eine Liste von Byte [], die von einem Thread gefüllt wird, und dann habe ich einen anderen Thread, der aus dieser Liste liest und die Elemente durch das Netzwerk sendet. enter image description hereWie kann ich ein Element aus der Liste entfernen ohne .remove?

Ich möchte jedes Mal ein Element in Thread2 lesen, um es aus dem Speicher zu löschen. Aber da ich Threads verwende, muss ich, wenn ich .remove benutze, den Index der Liste ändern und thread1 nicht daran schreiben lassen, während ich das tue. Also, damit ich nicht mit dem Index der Liste interfire, ändere ich nur das Element, das ich benutze Null. Was ist der beste Weg, dies zu tun, damit es nicht Speicherplatz im Speicher verschwendet?

+5

Warum nicht eine ['ConcurrentQueue'] (https://msdn.microsoft.com/en-US/library/dd267265 (v = vs.110) .aspx) verwenden? – sloth

Antwort

4

Es klingt, als ob Sie stattdessen eine ConcurrentQueue verwenden möchten.

ConcurrentQueue A ist eine Thread-safe first-in/first-out-Sammlung, so dass der erste Thread Elemente in die Warteschlange mit Enqueue während des zweiten Faden Artikel lesen aus der Warteschlange mit TryDequeue versuchen würde schieben würde.

+0

Wenn ich 'TryDeQueue' verwende und es erfolgreich liest, löscht es es aus der Warteschlange? – meme

+0

@meme ja. TryDequeue versucht, das Objekt am Anfang der Warteschlange für gleichzeitige Ausführung zu entfernen und zurückzugeben. – sloth

+0

Danke für die Antwort. Es half eine Tonne. :) – meme

2

Basierend auf Frage klingt es wie Zuweisung für kritische Abschnitte (aka lock).

erstellen Sperrobjekt und führen Lese-/Schreib unter lock:

object lockList = new object(); 

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

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

Beachten Sie, dass in der Regel für Verbraucher/Erzeuger Sie ConcurrentQueue verwenden würde.

Verwandte Themen