Запись в файл из разных потоков
Будет ли достаточно такого метода чтобы записывать необходимые строки в .txt из разных потоков ?
private static object _locker = new object();
public static void Sohranenie(string path,string text)
{
FileInfo file = new FileInfo(path);
if (file.Exists == false)
{
file.Create();
}
lock (_locker)
{
StreamWriter writer = new StreamWriter(path, true, Encoding.UTF8);
writer.Write(text + Environment.NewLine);
writer.Close();
}
}
UPD: Необходима запись не только в один файл, а возможно и в разные.
Ответы (1 шт):
Автор решения: aepot
→ Ссылка
Я думаю, метод неплох, но можно лучше
private static readonly object _locker = new object();
public static void ConcurrentSave(string path, string text)
{
lock (_locker)
{
File.AppendAllText(path, text + Environment.NewLine);
}
}
Здесь все еще есть минус, если вы одновременно пишете в несколько файлов, но все равно сможете писать одновременно только в один из них. Чтобы использовать блокировку для каждого файла свою, надо метод дорабатывать.
Например вот так
private static readonly ConcurrentDictionary<string, object> _locks = new ConcurrentDictionary<string, object>();
public static void ConcurrentSave(string path, string text)
{
object obj;
while (!_locks.TryGetValue(path, out obj))
{
obj = new object();
if (_locks.TryAdd(path, obj))
break;
}
lock (obj)
{
File.AppendAllText(path, text + Environment.NewLine);
}
}
Тогда у каждого файла будет своя блокировка. Кодировка в .NET для файлов кстати по умолчанию всегда UTF-8, так что можно явно не задавать.