У меня есть следующий делегат события, который в основном принимает массив байтов и присоединяет его к файловому потоку. Как только он написал 1000 раз, что отслеживается локальной переменной counter
, я хочу закрыть текущий поток и открыть новый.Как можно гарантировать, что FileStream будет удален после того, как все WriteAsync() в текущем файле будут завершены?
Я прочитал документацию FileStream и предложил использовать FileStream.WriteAsync()
для лучшей производительности.
public void WriteData(byte[] data)
{
counter++;
if (counter == 1000)
{
counter = 0;
// Close the current filestream and open a new one.
filestream.Dispose();
filestream = new FileStream(this.outputPath, FileMode.Create,
FileAccess.Write, FileShare.None, 4096, true);
}
filestream.WriteAsync(data, 0, data.Length);
}
Однако в приведенной выше функции, моя гипотеза состоит в том, что это может быть так, что все WriteAsync()
вызовы не завершены, прежде чем я называю filestream.Dispose()
. Есть ли способ гарантировать, что я только Dispose()
после того, как все мои звонки WriteAsync()
завершены? Обратите внимание, что делегат этого события вызывается последовательно 1000 - 2000 раз в секунду, а WriteAsync копирует 240 КБ на звонок на SSD.
Одно решение, которое я могу думать вместо того, чтобы немедленно утилизации каждого Filestream
сразу, я могу хранить его в массив Filestream
, а затем избавиться от них, как только я закончил весь процесс записи данных и нет больше событий нет обжиг. Будет ли это работать? Даже тогда, как я могу «дождаться» до тех пор, пока все вызовы WriteAsync()
не будут завершены?
'ждут filestream.WriteAsync (...); filestream.Dispose; '? – Kritner
@Kritner Поток не размещается после каждой записи. – Servy
У вас не должно быть асинхронного метода «void». Вы всегда должны выставлять вызывающему устройству средство определения того, когда асинхронное действие завершено (в этом случае, вернув «Задачу»). Обратите внимание, что с вашим текущим кодом вы можете не только избавиться от потока во время записи, но вы можете отправить дополнительную запись, пока более ранняя запись еще не закончена, что также * вызовет проблемы. – Servy