Написание Stringbuilder для асинхронного файла. Этот код управляет файлом, записывает в него поток и освобождает его. Он касается запросов от асинхронных операций, которые могут появиться в любое время.
FilePath устанавливается для экземпляров класса (так что объект блокировки для каждого экземпляра), но есть вероятность конфликта, поскольку эти классы могут совместно использовать FilePaths. Такой конфликт, как и все другие типы извне класса экземпляра, будет рассматриваться с повторениями.
Является ли этот код подходящим для его цели? Есть ли лучший способ справиться с этим, что означает меньшую (или нет) зависимость от механика catch и retry?
Также как избежать исключения исключений, возникших по другим причинам.
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();
}