Avatar billede arnejan Nybegynder
18. februar 2004 - 23:01 Der er 7 kommentarer og
1 løsning

foreach konstruktion ?

Exception i testmethod():

Hvis jeg bruger sådan en her konstruktion.

foreach (St st in stList)
{
//her sker noget der tager et par ticks, for hver st.
}

hvor stList er en ArrayList med f.eks. 100 St elementer.

Får jeg nogen gange en Exception som nedenfor. Fordi der bliver tilføjet eller fjernet ting fra stList, i andre tråde.

Hvordan kan jeg f.eks. lave min foreach konstruktion så at jeg kan undgå dette. Hvordan kan jeg f.eks låse på en smart måde.

Mit problem er at jeg heller ikke ønsker at lave for dårlig performance.

Her er fejlen:

System.InvalidOperationException: Collection was modified; enumeration operation may not execute.
  at System.Collections.ArrayListEnumeratorSimple.MoveNext()

Og hov jeg har ikke flere point,
Avatar billede arne_v Ekspert
18. februar 2004 - 23:05 #1
Du kan godt lave andre løkke konstruktioner, som ikke vil give exception - bare
unpredictable resultater.

Du kan lade alle tråde som bruger stList lave en:

lock(stList)
{
  ...
}

Det koster lidt i performance, men vil give konsistente resultater.
Avatar billede arnejan Nybegynder
18. februar 2004 - 23:13 #2
Hmm.

Hvis man bruger lock(stList.SyncRoot) rund om alle løkker, er man så også 100% sikret.

Eller skal man mon også låse, de steder man tilføjer og fjerner fra stList.

Jeg er nødt til at have konsistente resultater, kan ikke bare køre videre som om intet var hendt (har jeg fundet ud af).

Tror du det koster noget af betydning i performance ? Jeg er ligeglad med at tråden hænger, bare tiden kan bruges et andet sted.
Avatar billede arne_v Ekspert
18. februar 2004 - 23:18 #3
Jeg kendte faktisk ikke SyncRoot, men ja det må være den der skal bruges.

Når en tråd venter p.g.a. en lock, så kommer andre tråde til. Overheadet
er kun i switch mellem trådene.
Avatar billede arnejan Nybegynder
18. februar 2004 - 23:23 #4
Tror du kun man skal låse i løkkerne, eller også de andre steder ?
Avatar billede arne_v Ekspert
19. februar 2004 - 07:15 #5
Det kan også være relevant andre steder.
Avatar billede arnejan Nybegynder
19. februar 2004 - 20:39 #6
Jeg har nattefillosoferet over sagen (man er vel lidt nørd), og er kommet frem til følgende:

Hvis man låser på et obj låser man ikke på tilgang til samme obj fra andre steder.

Hvis man låser på et obj låser man kun iforhold til andre steder der er låst på samme obj.

Derfor må det være nødvendigt at låse alle steder, og ikke kun i løkken.

Det er en tanke, men det må bestemt være rigtigt.
Avatar billede arne_v Ekspert
19. februar 2004 - 21:15 #7
Låsning er coorperativt d.v.s. at du skal låse alle de steder hvor det
er nødvendigt.

Men om "hvor det er nødvendigt" er lig med "alle steder" afhænger
af den konkrete situation.

Ændringer vil næsten altid skulle låses, men læsninger behøves ikke
altid.
Avatar billede arnejan Nybegynder
22. februar 2004 - 16:06 #8
Det kan jeg godt forstå.

Iøvrigt skal man jo også være opmærksom på at "fejlen" oftest vil opstå fordi man kommer til at køre en ICollection.Remove inde i løkken.

Tak
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester