2

Задача: записывать в файл данные из нескольких потоков.

При последовательной записи (режим Append) работает без ошибок.

_waitWriteHandler.WaitOne();

using (BinaryWriter bw = new BinaryWriter(new FileStream(Destination, FileMode.Append, FileAccess.Write, FileShare.Write)))
{
    bw.Write(data);
}

_waitWriteHandler.Set();

А если сначала создать файл:

using (BinaryWriter bw = new BinaryWriter(new FileStream(Destination, FileMode.Create, FileAccess.Write, FileShare.None)))
{
    bw.Write(new byte[destinationFileSize]);
}

И в разные места начать писать данные:

_waitWriteHandler.WaitOne();

using (BinaryWriter bw = new BinaryWriter(new FileStream(Destination, FileMode.Open, FileAccess.Write, FileShare.None)))
{
    bw.BaseStream.Position = position;
    bw.Write(data);
}

_waitWriteHandler.Set();

то выдает необработанное исключение, что файл уже используется другим процессом (причем дает часть данных записать, всегда по-разному).

Использую класс Thread и AutoResetEvent для синхронизации.

slippyk
  • 6,161
  • Напрямую писать в файл одновременно разными потоками не получится, хотя бы потому что это не логично, не говоря уже об ограничениях системы и др. Как вариант можно использовать временный буфер. – JavaJunior May 02 '18 at 18:15
  • FileShare.None -- монопольный режим же, разве нет? да и вроде явно файл не закрываете после записи. – Alias May 03 '18 at 05:56

1 Answers1

3

Можно получать эксклюзивные права на запись в файл(FileShare.None), как вы и делаете, но постоянные переоткрытия файла с блокировкой будут очень узким местом.
Также придётся отлавливать System.IO.IOException, например, в бесконечном цикле, чтобы дождаться освобождения файла.

Лучше всего собирать данные в разных потоках, но писать в одном, специально для этого выделенном, через механизм очереди.
Скармливаете ему "задачи", а он их выполняет. (Это называется producer-consumer)

vp_arth
  • 27,179
  • 1
    Благодарю за наводку. Помогло вот это решение https://ru.stackoverflow.com/questions/428327/%D0%98%D0%BC%D0%BF%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D1%86%D0%B8%D1%8F-producer-consumer-pattern – slippyk May 05 '18 at 15:25