Thread synkronisering, locks? tror jeg nok

Tags:    .net

Hej,

Jeg er igang med at skrive en stream ripper (code.google.com/p/thelastripper) som skole projekt (Teknologi på HTX).
Anyway, jeg er løbet ind i nogle problemer med alle de thread som System.Timers.Timer skaber. Jeg har nemlig en metode som foretager et http opkald, så den må gerne køre på sin egen thread. Men funktionen må IKKE blive kørt af 2 gange på engang, det giver store problemer i en anden del af koden.
På samme måde har jeg et sted hvor flere threads kan komme til at skrive til en fil på engang, derfor skal filen's handle selvfølgelig låses.
Jeg har kigget lidt på dokumentation af System.Threading.Monitor.Enter/TryEnter/Exit; men jeg har ikke få det til at virke.

For at forenkle spørgsmålet, har jeg lavet et lille eksempel af problemet:
Fold kodeboks ind/udKode 


Jeg skal altså undgå at der komme til at stå "Starting thread" 2 gang lige efter hinanden i outputtet... Hvordan gør jeg det?
Det skal siges at jeg arbejde med både Mono og M$ .Net Framework 2.0
Det har lykkedes mig at gøre det ved at lave en boolean som jeg så give true/false alt efter om der er thread der er igang med arbejde i metoden. Men så vidt jeg ved, må man ikke rigtig tilgå variabler fra flere threads uden at låse dem... Men hvordan???

Håber der er nogen der kan hjælpe, mit program går ned engang i mellem, og vil slet ikke kører på dualcore pc'er :)



5 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 4 karma
Sorter efter stemmer Sorter efter dato
Du var da ikke tvunget til at give mig pointsne. Men tak. :)



Prøv at kigge på Threading.Join().



Jeg kan ikke lige se hvor du vil hen, skulle jeg så vente på at en anden thread dør ud...
Der er jo ikke en thread igang med HandleTick() til at starte med... Hvis jeg skrive

HandleTick(...)
{
Thread.Join();
...
}


Står den jo bare stille der, desuden kan der kører mange andre threads i baggrund på min applikation som terminere i tide og utide...
Som jeg kan læse det af dokumentation så skal monitor.enter(...) vente på at en anden thread har frigivet låsen med monitor.exit(...)
Men hvorfor virker det ikke?



Er du sikker på din HandleTick bliver kørt?



Prøv at kigge på koden...
Ja, den bliver kørt, den bliver startet op på en ny thread af System.Timers.Timer hvert sekund...
Derfor skriver den:
Starting thread
Starting thread
Starting thread
Ending thread
Starting thread
...

Jeg skulle have den til at skrive:
Starting thread
Ending thread
Starting thread
....

Fordi de ikke må køre oven på hinanden i mit program.

Men jeg fandt selv løsningen: http://www.albahari.com/threading/part2.html#_Locking

Det objekt jeg låser skal altså være en static, hvordan, hvorfor, aner jeg ikke... Men jeg får det rigtige hvis jeg skriver:
static System.Object Locker = new System.Object();
Og låser den i min HandleTick...

Nogen der kan forklare mig det???

Anyway, tak for hjælpen...



t