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.
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!”
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
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.
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...
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