Hej >... eller använder Hashtable.Synchronized för att få en synkad wrapper. Tack för påminnelsen. :-)Lock
Jag har problem med mina trådar, hashtables och lås (jobbar i compact framework):
Hashtables är ju inte threadsafe såvida man inte låser dem vid skrivning och iteration. Låt oss säga att jag har en hashtable som innehåller object av typen myclass. Om jag skall uppdatera innehållet i ett av dessa objecten måste hashtablen då låsas
ex
lock(myHashtable.SyncRoot)
{
myclass obj = (myclass)myHashtable["somekey"];
obj.prop = "test";
}
Jag förutsätter att man måste det, men där kommer mitt problem in: Mitt program hänger på lock(myHashtable.SyncRoot)
Tacksam för hjälp
/peterbladhSv: Lock
>Hashtables är ju inte threadsafe såvida man inte låser dem vid skrivning och iteration.
... eller använder Hashtable.Synchronized för att få en synkad wrapper.
>Om jag skall uppdatera innehållet i ett av dessa objecten måste hashtablen då låsas
Nej
>obj.prop = "test";
Om det är prop egenskapen du vill ska vara trådsäker så borde du lägga synkroniseringskoden inne i prop { set {} } istället.
MSSv: Lock
Är det någon fördel med detta alternativ? (Hashtable.Synchronized finns iof inte i CF, men jag är nyfiken ändå)
>>Om jag skall uppdatera innehållet i ett av dessa objecten måste hashtablen då låsas
>Nej
Varför? Läser en annan tråd borde det ju bli problem...?
>>obj.prop = "test";
>Om det är prop egenskapen du vill ska vara trådsäker så borde du lägga >synkroniseringskoden inne i prop { set {} } istället.
Men om propertyn är en sträng är den väl i sig trådsäker?
/peterbladhSv: Lock
>Är det någon fördel med detta alternativ?
Du slipper skriva synkroniseringskod själv.
>Varför? Läser en annan tråd borde det ju bli problem...?
Att modifiera ett objekt påverkar inte hashtabellen, som bara håller en lista med referenser till objekten. Det är bara om du ska ändra innehållet i tabellen (lägga till eller ta bort objekt) som den måste låsas.
>Men om propertyn är en sträng är den väl i sig trådsäker?
Nej
MS