Я не думаю, что это может поставить в очередь операции read ... в конце концов, у вас есть байтовый массив, в нем будут некоторые данные после вызова Read
- эти данные лучше быть правильным. Вероятно, буферизуются только операции write .
Вы можете периодически вызывать Flush
для выходного потока ... Я не знаю, как далеко зайдет Flush
с точки зрения различных уровней кэширования, но вполне может подождать, пока данные на самом деле было написано. РЕДАКТИРОВАТЬ: Если вы знаете, что это FileStream
, вы можете позвонить Flush(true)
, который будет ждать, пока данные действительно будут записаны на диск.
Обратите внимание, что вы не должны делать это слишком часто, иначе производительность значительно снизится. Вам нужно будет сбалансировать гранулярность точности хода выполнения с потерей производительности для получения большего контроля вместо того, чтобы позволить ОС оптимизировать доступ к диску.
Я обеспокоен тем, что вы используете рекурсию здесь - для очень большого файла вы можете просто взорвать переполнение стека без веской причины. (CLR иногда может оптимизировать хвостовые рекурсивные методы, но не всегда). Я предлагаю вам использовать цикл вместо. Это также было бы более читабельным, ИМО:
public void Copy()
{
int bytesRead;
while ((bytesRead = _sourceStream.Read(_buffer, 0, _buffer.Length)) > 0)
{
_destinationStream.Write(_buffer, 0, bytesRead);
_completedBytes += bytesRead;
TriggerProgressUpdate();
if (someAppropriateCondition)
{
_destinationStream.Flush();
}
}
}
Надеюсь, вы где-то избавляетесь от потоков, кстати. Лично я стараюсь избегать использования одноразовых переменных-членов, если это вообще возможно. Есть ли причина, по которой вы не можете просто использовать локальные переменные в операторе using
?