Stringbuilder asynchron in Datei schreiben. Dieser Code übernimmt die Kontrolle über eine Datei, schreibt einen Stream und gibt ihn frei. Es behandelt Anfragen von asynchronen Operationen, die jederzeit eingehen können.In eine Thread-sichere Weise in die Datei schreiben
Der FilePath wird pro Klasseninstanzen festgelegt (das Sperrobjekt ist also pro Instanz), aber es besteht ein Konfliktpotential, da diese Klassen FilePaths gemeinsam nutzen können. Diese Art von Konflikt sowie alle anderen Typen außerhalb der Klasseninstanz werden mit Wiederholungen behandelt.
Ist dieser Code für seinen Zweck geeignet? Gibt es einen besseren Weg, damit umzugehen, was bedeutet, dass man sich weniger auf die Fang- und Wiederholungsmechanik verlässt?
Wie vermeide ich auch das Abfangen von Ausnahmen, die aus anderen Gründen aufgetreten sind.
public string Filepath { get; set; }
private Object locker = new Object();
public async Task WriteToFile(StringBuilder text)
{
int timeOut = 100;
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
while (true)
{
try
{
//Wait for resource to be free
lock (locker)
{
using (FileStream file = new FileStream(Filepath, FileMode.Append, FileAccess.Write, FileShare.Read))
using (StreamWriter writer = new StreamWriter(file, Encoding.Unicode))
{
writer.Write(text.ToString());
}
}
break;
}
catch
{
//File not available, conflict with other class instances or application
}
if (stopwatch.ElapsedMilliseconds > timeOut)
{
//Give up.
break;
}
//Wait and Retry
await Task.Delay(5);
}
stopwatch.Stop();
}
Ihre tatsächlichen Dateischreibvorgänge sind nicht asynchron. Meintest du damit? –
@StephenCleary, ja es gab anfangs aber man sollte nicht auf Dinge in einem Schloss warten, also musste ich es ändern. Ich bin nicht sicher, in welchem Ausmaß das alles untergräbt. –
Das klingt wie es auf codereview sein sollte tbh –