Posiadam odpalonych kilkanaście tasków, które nieustannie zapisują dane do kilku plików, po kilka razy na sekundę każdy. Próbuję znaleźć najlepsze rozwiązanie dla uniknięcia błędów związanych z dostępem do pliku.
Wstępnie sprawdzałem czy plik jest gotowy do zapisu:
private void SaveToFile(string line, string file)
{
if (File.Exists(file))
{
while (!IsFileReady(file))
{
await Task.Delay(5);
}
}
File.AppendAllText(file, line + Environment.NewLine);
}
private bool IsFileReady(string file)
{
try
{
using (FileStream inputStream = File.Open(file, FileMode.Open, FileAccess.Read, FileShare.None))
return inputStream.Length > 0;
}
catch (Exception)
{
return false;
}
}
Jednak zdarzały się błędy, a mi osobiście trochę ciężko się to debuguje.
Następnie znalazłem poniższe rozwiązanie tutaj: https://stackoverflow.com/a/41262326/12603542
private ReaderWriterLock _locker = new ReaderWriterLock();
private void SaveToFile(string line, string file)
{
try
{
_locker.AcquireWriterLock(10000); //You might wanna change timeout value
File.AppendAllText(file, line + Environment.NewLine);
}
finally
{
_locker.ReleaseWriterLock();
}
}
Jednak jeszcze dobrze go nie przetestowałem i ciekaw jestem czy macie jakieś inne sprawdzone podejścia?