En gang imellem kommer man ud for at man skal logge events i et multitrådet miljø. Her nytter det ikke noget bare at skrive løs i en fil, for så opstår der hurtigt låsningsproblemer.
Jeg sidder for tiden med et logningsmodul, der bruger en TextWriter som persisteringsmedie, og lige siden jeg har løftet klientapplikationen op i en multitrådet udgave, begynder jeg at få System.IO.IOException’s når jeg sætter applikationen i gang. Det er selvfølgelig fordi alle trådene forsøger at skrive til den samme fil på samme tid. Hvordan kommer man lige uden om det?
Læser man i dokumentationen for TextWriter, står der også ganske rigtigt: Alle public static medlemmer af denne type er trådsikre, hvorimod instans medlemmer ikke er garanteret sikre.
Man kan med andre ord ikke direkte bruge i disse multitråede scenarier – man er nød til at pakke den ind i en wrapper med en lock, så man kan styre adgangen – altså synkronisere trådene.
Lige inden jeg skulle til at gå i gang med at skrive en trådsikker wrapper, fik jeg øje på en statisk metode på TextWriter: Syncronized. Det er lige nøjagtigt den wrapper, som jeg skulle til at skrive – man skal blot instantierer sin TextWriter med den:
private static TextWriter _writer =
TextWriter.Syncronized(new StreamWriter("fil.txt", true));
Så har man en trådsikker TextWriter – uden at skrive een linie kode – Thank You MS….
Code on…