Thread synkronisering, locks? tror jeg nok
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:
[code]
class MainClass
{
public static void Main(string[] args)
{
System.Timers.Timer T = new System.Timers.Timer();
T.Interval = 1000;
MainClass M = new MainClass();
T.Elapsed += new System.Timers.ElapsedEventHandler(M.HandleTick);
T.Start();
Console.ReadLine();
T.Stop();
Console.ReadLine();
}
public System.String t = "hej med dig";
public void HandleTick(System.Object Sender, System.Timers.ElapsedEventArgs Args)
{
//if(System.Threading.Monitor.TryEnter(this.t))
//{
System.Threading.Monitor.Enter(this.t);
Console.WriteLine("Starting thread");
this.t += "dhhj";
System.Threading.Thread.Sleep(3000);
Console.WriteLine("Ending Thread");
System.Threading.Monitor.Exit(this.t);
//}
}
}
[/code]
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 :)