Запись в файл из разных потоков

Будет ли достаточно такого метода чтобы записывать необходимые строки в .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, так что можно явно не задавать.

→ Ссылка