From .NET 4.5 on, there is the href="http://msdn.microsoft.com/en-us/library/system.io.stream.copytoasync.aspx"
rel="noreferrer">Stream.CopyToAsync
method
input.CopyToAsync(output);
This
will return a href="http://msdn.microsoft.com/en-us/library/system.threading.tasks.task.aspx"
rel="noreferrer">Task
that can be continued on
when completed, like so:
await
input.CopyToAsync(output)
// Code from here on will be run in a
continuation.
Note that depending
on where the call to CopyToAsync
is made, the code that follows
may or may not continue on the same thread that called
it.
The href="http://msdn.microsoft.com/en-us/library/system.threading.synchronizationcontext.aspx"
rel="noreferrer">SynchronizationContext
that was
captured when calling href="http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx"
rel="noreferrer">await
will determine what thread
the continuation will be executed on.
Additionally, this
call (and this is an implementation detail subject to change) still sequences reads and
writes (it just doesn't waste a threads blocking on I/O
completion).
From .NET 4.0 on, there's is the
rel="noreferrer">Stream.CopyTo
method
input.CopyTo(output);
For
.NET 3.5 and before
There isn't anything
baked into the framework to assist with this; you have to copy the content manually,
like so:
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);
}
}
Note 1: This method
will allow you to report on progress (x bytes read so far ...)
Note 2: Why
use a fixed buffer size and not input.Length
? Because that
Length may not be available! From the href="https://docs.microsoft.com/en-us/dotnet/api/system.io.stream.canseek"
rel="noreferrer">docs:
readability="10">
If a class derived from Stream does not support
seeking, calls to Length, SetLength, Position, and Seek throw a
NotSupportedException.
No comments:
Post a Comment