Zapisywanie konstruktora String do pliku asynchronicznie. Ten kod przejmuje kontrolę nad plikiem, zapisuje do niego strumień i uwalnia go. Obsługuje żądania z asynchronicznych operacji, które mogą wejść w dowolnym momencie.Zapisywanie do pliku w sposób bezpieczny dla wątku
Wartość FilePath jest ustawiana dla instancji klasy (w związku z czym obiekt blokady jest dla każdej instancji), ale istnieje możliwość konfliktu, ponieważ klasy te mogą współużytkować ścieżki FilePath. Taki rodzaj konfliktu, jak również wszystkie inne typy spoza instancji klasy, zostaną rozwiązane z ponownymi próbami.
Czy ten kod jest odpowiedni do tego celu? Czy istnieje lepszy sposób radzenia sobie z tym, co oznacza mniej (lub nie) poleganie na mechanizmie catch and retry?
Również, jak uniknąć wyjątków, które wystąpiły z innych przyczyn.
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();
}
Rzeczywiste zapisy plików nie są asynchroniczne. Miałeś na myśli, że oni są? –
@StephenCleary, tak, początkowo, ale nie powinieneś czekać na rzeczy w zamku, więc musiałem to zmienić. Nie jestem pewien, w jakim stopniu to wszystko podkopuje. –
To brzmi jak powinno być na codereview tbh –