От.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: Этот метод позволит Вам сообщать относительно прогресса (x чтение байтов до сих пор...)
Примечание 2: Почему использование фиксированный размер буфера а не input.Length
? Поскольку та Длина не может быть доступной! От эти документы :
, Если класс, полученный из Потока, не поддерживает поиск, вызовы к Длине, SetLength, Положение, и Искать бросает NotSupportedException.
Нет, если вы используете двумерный массив, это невозможно. Вы должны скопировать каждый элемент.
Если вы используете массив с зазубринами, он отлично работает:
// create array of arrays
object[][] tableOfObject = new object[10][];
// create arrays to put in the array of arrays
for (int i = 0; i < 10; i++) tableOfObject[i] = new object[10];
// get row as array
object[] rowOfObject = GetRow();
// put array in array of arrays
tableOfObjects[0] = rowOfObjects;
Если вы получаете все данные в виде строк, вам, конечно, не нужен цикл, который помещает массивы в массив массивов, так как вы все равно просто замените их.
Итак, что-то вроде:
public static object[] GetRow()
{
object[,] test = new object[10,10];
int a = 0;
object[] row = new object[10];
for(a = 0; a <= 10; a++)
{
row[a] = test[0, a];
}
return row;
}
if I have gigabyte size arrays, I would do it in C++/CLI playing with pointers and doing just memcpy instead of having gazillion slow boundary-checked array indexing operations.