Laden...

threading multiple locks()

Erstellt von inva vor 15 Jahren Letzter Beitrag vor 15 Jahren 872 Views
I
inva Themenstarter:in
37 Beiträge seit 2007
vor 15 Jahren
threading multiple locks()

Hallo liebe Community,
eine kurze Frage.
Nachdem es in C# nicht möglich ist Defaultparameter für Funktionen zu definieren, muss man die gewünschte Funktion überladen.
Ich habe eine Logging Klasse, in welcher, natürlich, ein Dateizugriff stattfindet.
Dieser ist jedoch innerhalb des locks. Nun soll diese funktionalität natürlich eine beide Methoden. Jedoch greifen beide Methoden auf die selbe log Datei zu, daher meine Frage, ob folgender Code möglich ist und einen doppelter Zugriff auf die log datei dadurch verhindert wird. Da ich mir unsicher bin ob es so Möglich ist, wie ich es mir vorstelle.

Vielen Dank im Vorraus für euer Feedback.


private static Object thisLock = new Object();

public static void Add(string strNew, bool bError)
{
     // lock the code segment below to avoid multiple access to the Logfile
     lock (thisLock)
     {
           .
           .
           .  
     }
}


public static void Add(string strNew)
{
     // lock the code segment below to avoid multiple access to the Logfile
     lock (thisLock)
     {
           .
           .
           .  
     }
}

MfG
inva

Aller Wahrscheinlichkeit nach wird das Weltall von einem Rudel Irrer regiert.

4.506 Beiträge seit 2004
vor 15 Jahren

Hallo inva,

konkret zu Deiner Frage:
Wenn beide Methoden in der gleichen Klasse sind, dann greifen sie auch auf das gleiche "thisLock" zu, und somit würde das funktionieren, ABER:

Ich empfehle Dir eine weitere private Methode zu definieren, die das Rausschreiben in die Datei kapselt. Und in dieser Methode machst Du einen einzigen Lock-Zugriff, der auf immer das gleiche Objekt zurückgreift. Dann kannst Du von überall in Deiner Klasse die Methode aufrufen, und brauchst Dich nicht weiter um das Synchronisieren kümmern.

Grüße
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo inva,

typischerweise würde man, wenn man Default-Parameter simuliert, von der einen Methode die andere Methode aufrufen und bräuchte entsprechend nur in dieser aufgerufenen Methode ein lock.

Davon abgesehen würde es auch so gehen, wie du es aufgezeigt hast.

herbivore

I
inva Themenstarter:in
37 Beiträge seit 2007
vor 15 Jahren

Gute Morgen, Danke euch zwei für die hilfreiche Antwort!

Die Idee, den Dateizugriff in einer extra Methode zu kapseln hatte ich auch schon. Wollte aber erst einmal abwarten, was hier für Reaktionen kommen.

Der Vorschlag von herbivore klingt ganz gut, ich denk ich probiere es einmal damit.

Nochmals, besten Dank für die Reaktionen und Ideen!

Liebe Grüße,
inva

Aller Wahrscheinlichkeit nach wird das Weltall von einem Rudel Irrer regiert.

3.971 Beiträge seit 2006
vor 15 Jahren

Um das ganze auch performant zu gestalten, sollten locks nur um den Bereich gelegt werden, die nicht parallel laufen können. Beispielsweise müsste wie in deinem Fall die "Funktion" prepareMessage nicht gelockt werden sondern ausschließlich das entsprechende Write.

Beim Logging empfiehlt es sich auch bereits fertige Klassen wie Log4net zu verwenden.

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo kleines_eichhoernchen,

Um das ganze auch performant zu gestalten, sollten locks nur um den Bereich gelegt werden, die nicht parallel laufen können.

je nachdem, wie man "können" interpretiert. Ich würde es genau andersherum sehen. Man braucht lock, bei den Bereichen, die parallel laufen könn(t)en, aber nicht dürfen.

Aber das ändert natürlich nichts daran, dass man die gelockten Bereiche so klein wie möglich (und so groß wie nötig) halten sollte.

herbivore