IPC und Objektzugriff aus anderen Threads

24/09/2008 - 22:04 von Sven Wieschendorf | Report spam
Hallo NG,

ich habe gerade angefangen mich mit Threads zu beschaeftigen und renne
wohl gerade in die ganzen Probleme, die dieses Thema mit sich bringt.
Vielleicht koennt Ihr mir ja ein wenig helfen, mich in diesem
Dschungel zurechtzufinden.

Akut geht es momentan darum, eine generisches Logging Assembly fuer
meine Applikationen zu schreiben.

Vereinfacht dargestellt, handelt es sich dabei um eine Main-Thread,
der mehrere Worker-Threads starten soll. Hier mal eine vereinfachte
Darstellung, wie ich mir das Ganze gedacht habe :

Main Thread : Empfaengt ueber Methoden Log Statements von einem
Programm, formatiert diese und stellt die formattierten Daten dann in
eine ArrayList (die innerhalb dieser Klasse definiert ist).

Worker Thread 1 : Soll stupide die Daten aus der ArrayList in eine
Datei schreiben.

Worker Thread 2 : Ueberwacht die Datei und wenn sie zu gross wird,
soll ein Flag (Ereignis) in Worker Thread 1 gesetzt werden der das
Schreiben stoppt, dann die Datei verkleinert, und das Schreiben im
Worker Thread 1 wieder startet.


Meine Probleme :

1. Ich kann aus dem Worker Thread 1 nicht auf die ArrayList im Main
Thread zugreifen. Waere sowas ueber Singleton Klassen machbar, oder
funktionieren die nur im eigenen Thread ?

2. Wie weit sind Singletons eigentlich gueltig ? Threadweit ?
Prozessweit ? Systemweit ?

3. Ich habe gelesen, dass es fuer die IPC diverse Ansaetze in .NET
gibt (Remoting, Mutexe, etc.) - jedoch hat mich das ganze etwas
verwirrt und ich bin mir nun absolut unschluessig, welche Methoden
fuer mich Sinn ergeben und welches veraltete und welches zeitgemaesse
Ansaetze sind. Hat dazu vielleicht jemand einen Link, wo man sowas
nachlesen kann ?

4. Generell, wie kann ich einem Worker Thread Kommandos uebermitteln,
wie z.B. StartWork, InterruptWork, Shutdown, etc ? Der Thread sollte
dann auch entsprechend den internen Status zurueckgeben bzw. man
sollte diesen Status abfragen koennen wie z.B. Working, Interrupted,
TermInitialized, etc. Hat dazu jemand eine Idee, mit welcher Technik
man sowas am besten realisieren koennte ?

Jede Hilfe und jedes Beispiel sind herzlich willkommen .. :o)


Danke & Gruss,

Sven
 

Lesen sie die antworten

#1 Thomas Scheidegger
24/09/2008 - 23:06 | Warnen spam
Hallo Sven

Main Thread : Empfaengt ueber Methoden Log Statements
Worker Thread 1 : Soll stupide die Daten aus der ArrayList in eine
Datei schreiben.
Worker Thread 2 : Ueberwacht die Datei und wenn sie zu gross wird,



kurz: viel zu kompliziert/ineffizient,
ich sehe da (noch) keinen Grund für soviele Threads.
Maximal 1, falls Datenmenge entsprechend
und (synchrone) Disk-Zugriffszeiten einem zu lange dauern.


aus dem Worker Thread 1 nicht auf die ArrayList im Main
Thread zugreifen



ist primàr doch eine normale C#/OO-Frage,
erst dann kommt thread-safety dazu


ueber Singleton Klassen machbar



kommt darauf an wie Zugriff stattfindet,
aber thread-safe Singleton wàre etwa wie:
http://www.yoda.arachsys.com/csharp/singleton.html
http://msdn.microsoft.com/en-us/lib...98558.aspx


wie kann ich einem Worker Thread Kommandos uebermitteln



es gibt keinen expliziten/direkten Mechanismus dazu.
Je nach Situation, etwa selber gebaut per
nur zB: Queue+lock+ManualResetEvent
oder falls Zielthread = GUI-Thread
dann per Control.Invoke, AsyncOperationManager
oder ggf àhnlich:
BackgroundWorker.RunWorkerAsync
ThreadPool.QueueUserWorkItem


Tipp:
Einiges an Theorie+Grundlagen muss man sich wirklich erarbeiten,
'probieren' ist bei Multi-Threading unseriös.
Denn Threading muss schon 'by design' korrekt sein,
weder Compiler noch Debugger können da wirklich Fehler erkennen.
Und zB das Timing kann auf Kunden-PCs ganz anders sein
als auf Enwickler-PC => Bugs erst beim Kunden!


generisches Logging Assembly



sollte sich auch schon diverse als Open Source finden.



Thomas Scheidegger - 'NETMaster'
http://dnetmaster.net/

Ähnliche fragen