In this example htbTrades is a hashtable that is declared as a global variable and can be added to by other threads. I want to make sure that no items can be added to the htbTrades hashtable between the Clone and Clear operations. Is SyncLock what I should be using. Will the following achieve my objective.
Dim htb as hashtableSyncLock htbTrades.SyncRoot htb = htbTrades.Clone htbTrades.Clear()End SyncLock
Well - yes and no. It will only shallow copy the hashtable so a lot depends on what you are containing in the hashtable. Heres the best way i can explain that...
Imagine you have 10 cups on a table and each cup is connected to a Keyring via a peice of string. Cloning the hashtable merely adds another keyring and another 10 peices of string connected to the original cups. If you want 10 more cups, then i think you may need to CopyTo instead.
If you are only storing value types (and/or strings) it should work fine but if you are using it to hold instances of complex types/classes you might need to check what you are trying to acheive is actually working correctly.
I'm with idlemind - in fact i wouldn't even expose it is a global variable at all rather a private one with a readonly property and a few public methods to proxy access to it (AddToHash, CopyHash etc) with the synclocks in place in there.
nicksbell
ASKER
Thanks for your replies.
lokj, re my first comment, my issue is not with the Clone method. I know that works for what I am trying to do as I already have that in production. I simply want to make sure that no items can be added to the hashtable after Clone and before Clear, as then they would be lost altogether. I am not worried about the underlying objects contained in the hashtable as they are static and are never updated, only new ones are added.
Idle_mind, ok, I didn't realise that but that makes sense.
lokj, just to clarify, are you suggesting I create a class that inherits the hashtable class and then expose a public AddToHash method (which would handle the synclock) and all other code would call AddToHash? I guess that makes a lot of sense too as it stops the need for synclocks all over the place.
Well - yes and no. It will only shallow copy the hashtable so a lot depends on what you are containing in the hashtable. Heres the best way i can explain that...
Imagine you have 10 cups on a table and each cup is connected to a Keyring via a peice of string. Cloning the hashtable merely adds another keyring and another 10 peices of string connected to the original cups. If you want 10 more cups, then i think you may need to CopyTo instead.
If you are only storing value types (and/or strings) it should work fine but if you are using it to hold instances of complex types/classes you might need to check what you are trying to acheive is actually working correctly.