Начиная с .NET 4.5, существует метод Stream.CopyToAsync
input.CopyToAsync(output);
Это вернет Task
, который может быть продолжен после завершения, например:
await input.CopyToAsync(output)
// Code from here on will be run in a continuation.
Обратите внимание, что в зависимости от того, где сделан вызов CopyToAsync
, следующий код может продолжаться или не продолжаться в том же потоке, который его вызвал.
SynchronizationContext
, захваченный при вызове await
, определит, в каком потоке будет выполняться продолжение.
Кроме того, этот вызов (и это деталь реализации, подлежащая изменению) все еще выполняет последовательности операций чтения и записи (он просто не тратит потоки, блокирующие завершение ввода-вывода).
Начиная с .NET 4.0, существует метод Stream.CopyTo
input.CopyTo(output);
Для .NET 3.5 и ранее
Ничего не запечено в рамках, чтобы помочь с этим; Вы должны скопировать содержимое вручную, например так:
public static void CopyStream(Stream input, Stream output)
{
byte[] buffer = new byte[32768];
int read;
while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
{
output.Write (buffer, 0, read);
}
}
Примечание 1: Этот метод позволит вам сообщать о прогрессе (пока прочитано х байт ...)
Примечание 2: Зачем использовать фиксированный размер буфера, а не input.Length
? Потому что эта длина может быть недоступна! Из документов :
Если класс, производный от Stream, не поддерживает поиск, вызовы Length, SetLength, Position и Seek выдают исключение NotSupportedException.