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