Hashtable-Object vor veränderung schützen

19/06/2009 - 20:06 von Jens Biermann | Report spam
Hallo zusammen,

ich stehe hier vor einer sehr herausvorderung wo ich unterstützung benötige.

Ich habe eine Klasse erstellt die eine Privates Hashtable Object
besitzt. Eine Methode ermöglicht es neue Elemente in die Liste auf zu
nehmen. Eine weitere Methode soll ermöglichen Elemente aus der Liste zu
entfernen die eine bedingung erfüllen. Das HashTable wird dabei mit
einer For Each Schleife durchlaufen. Wàrend dieser Zeit soll jedoch kein
weiteres Element hinzugefügt werden können.

Neue Elemente werden hinzugefügt wenn über eine Netzwerk Socket weitere
Clients die Verbindung aufnehmen. Da dies asynchron passiert kann es
durchaus sein das ein anderer Thread die Methode aufruft.
Das Entfernen wird durch einen Timer gesteuert, der ein weiteren Thread
darstellt.

Mit SnycLock oder der Monitor-Klasse lassen sich nur Bereiche
blockieren, jedoch nicht das Object. Oder verstehe ich das falsch?

Welche Möglichkeiten habe ich?

mfg
 

Lesen sie die antworten

#1 Elmar Boye
19/06/2009 - 21:46 | Warnen spam
Hallo Jens,

"Jens Biermann" schrieb ...
Ich habe eine Klasse erstellt die eine Privates Hashtable Object besitzt. Eine Methode ermöglicht es neue Elemente in die Liste
auf zu nehmen. Eine weitere Methode soll ermöglichen Elemente aus der Liste zu entfernen die eine bedingung erfüllen. Das
HashTable wird dabei mit einer For Each Schleife durchlaufen. Wàrend dieser Zeit soll jedoch kein weiteres Element hinzugefügt
werden können.



Sinnvoller hier ist im allgemeinen:
Erzeuge eine Kopie der Elemente der Liste, z. B. via CopyTo
und iteriere darüber. So wird die Sperre auf der Hashtable
kurz gehalten.
Funktionieren tut das allerdings nur, wenn Du davon ausgehen
(oder prüfen) kannst, dass die Elemente wàhrend der Iteration
gültig bleiben.

Neue Elemente werden hinzugefügt wenn über eine Netzwerk Socket weitere Clients die Verbindung aufnehmen. Da dies asynchron
passiert kann es durchaus sein das ein anderer Thread die Methode aufruft.
Das Entfernen wird durch einen Timer gesteuert, der ein weiteren Thread darstellt.



Mit Hashtable.Synchronized erhàlst Du einen thread-safe Wrapper
http://msdn.microsoft.com/de-de/lib...nized.aspx

wo die Methoden (Add/Remove etc.) synchronisiert werden.

Allerdings blockieren Enumerator die Liste selbst nicht,
so dass Du dort zusàtzlice synchronisieren müsstest -
deswegen ist obiges Vorgehen vorzuziehen.

Mit SnycLock oder der Monitor-Klasse lassen sich nur Bereiche blockieren, jedoch nicht das Object. Oder verstehe ich das falsch?



Das verstehst Du richtig:
SyncLock/Monitor sichern Codebereiche ab.
Und Deine Aufgabe ist es, Methoden abzusichern, die die Liste veràndern.
Hashtable.Synchronized übernimmt das bereits, in dem es bei den Methoden
jeweils ein SyncLock auf SyncRoot einfügt.

Mußt Du auch Verànderungen der enthaltenen Elemente verhindern,
so mußt Du dort eine zusàtzliche Synchronisierung einfügen.

Gruß Elmar

Ähnliche fragen