Avatar billede bernhof Nybegynder
10. juni 2005 - 11:39 Der er 9 kommentarer og
1 løsning

Monitor.Enter / Monitor.Exit

Hey eksperter. To spørgsmål:

(1) Jeg har et par member variabler i min klasse, som benyttes både af min hovedtråd og en worker-tråd ofte. Jeg skal derfor benytte Monitor.Enter og Monitor.Exit hver gang jeg læser/skriver fra dem. Men hvilke skal jeg beskytte på denne måde?

Jeg har læst på MSDN at man kun skal beskytte reference typer på denne måde, og ikke value typer. Jeg kan regne ud at objekt-typer som fx Control og FileInfo er reference typer, men hvilke af de simple datatyper er reference typer hhv. value typer? Her taler jeg om Strings, Int32 og Boolean.

(2) Jeg støder ind i et problem, når jeg skal beskytte member variabler som i nogle tilfælde kan være Nothing. Problemet består i, at Monitor.Enter smider en fejl, hvis jeg forsøger at beskytte en sådan tom variabel. Hvordan skal jeg gribe dette an?


På forhånd tak.
- Mikkel
Avatar billede arne_v Ekspert
10. juni 2005 - 11:43 #1
re 1)

int32 og boolean er value typer

string er reference type

(så vidt jeg husker)

re 3)

lav en skygge variabel specielt til at låse på (både for value typer og null)
Avatar billede arne_v Ekspert
10. juni 2005 - 11:45 #2
medmindre du har meget specielle krav vil jeg forslå

SyncLock var
    ...
End SyncLock

fremfor eksplicit brug af Monitor Enter og Exit
Avatar billede bernhof Nybegynder
10. juni 2005 - 11:53 #3
Hvad er fordelen ved at bruge SyncLock istedet?

Er løsningen med skyggevariabler den eneste løsning, som er tilgængelig? Selvom jeg har set mange andre der benytter den, synes jeg den virker lidt "fusket" og ikke særlig pæn :o)
Avatar billede arne_v Ekspert
10. juni 2005 - 11:59 #4
det er en feature som er en del af sproget og du er sikker på at få låst
op igen

ja det tror jeg
Avatar billede bernhof Nybegynder
10. juni 2005 - 12:07 #5
Ok, er der en lignende feature i C# eller skal man der selv kalde monitor.enter og .exit og sørge for, at der altid bliver låst op?
Avatar billede bernhof Nybegynder
10. juni 2005 - 12:11 #6
Og svarer brugen af SyncLock ikke til:

Try
  Monitor.Enter(var)
  ...
Finally
  Monitor.Exit(var)
End Try
Avatar billede arne_v Ekspert
10. juni 2005 - 12:13 #7
i C# er det:

lock(var)
{
  ...
}
Avatar billede arne_v Ekspert
10. juni 2005 - 12:13 #8
jo
Avatar billede bernhof Nybegynder
10. juni 2005 - 12:18 #9
Ah, ok.

Nå men tak for hjælpen. Læg et svar :o)
Avatar billede arne_v Ekspert
10. juni 2005 - 12:19 #10
svar
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
Kurser inden for grundlæggende programmering

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