2009-02-24 6 views
8

Tengo que procesar una matriz de bytes grande que se pasa a mi función. Necesito copiar el contenido de esta matriz de bytes entrante en "fragmentos" más pequeños a una matriz de bytes salientes.Necesito un bucle para copiar fragmentos de una matriz de bytes

Por cada "porción" de datos creada en la matriz de salida, necesito llamar a un servicio web.

A su regreso, debo reanudar el bucle a través de la matriz de bytes entrante, continuar pasando un fragmento parcial o total de datos hasta que se procese la matriz completa entrante (es decir, enviada al servicio web en fragmentos).

Soy muy nuevo en C# y estoy luchando con un bucle que funciona. Sé cómo llamar al servicio web para manejar un "fragmento" pero no puedo obtener el bucle correcto. Aquí hay un boceto del lío patético que tengo actualmente:

int chunkSize = 10000; 
byte[] outboundBuffer = new byte[chunkSize];  
while (BytesRead > 0) 
{ 
long i = 0; 
foreach (byte x in incomingArray) 
{ 
    BytesRead += 1; 
    outboundBuffer[i] = incomingArray[i] 
    i++; 
} 
uploadObject.Size = BytesRead; 
uploadObject.MTOMPayload = outboundBuffer; 

// call web service here and pass the uploadObject 

// get next "chunk" until incomingArray is fully processed 
} 

Sé que esto es un desastre y no funcionará; ¿alguien podría hacer un boceto adecuado para hacer esto? Muchas gracias.

Respuesta

17

Es posible que desee mirar en Array.Copy o Buffer.BlockCopy; Esto va a limpiar un poco las cosas, ya que no tendrá que copiar todos los bytes de forma individual:

int incomingOffset = 0; 

while(incomingOffset < incomingArray.Length) 
{ 
    int length = 
     Math.Min(outboundBuffer.Length, incomingArray.Length - incomingOffset); 

    // Changed from Array.Copy as per Marc's suggestion 
    Buffer.BlockCopy(incomingArray, incomingOffset, 
        outboundBuffer, 0, 
        length); 

    incomingOffset += length; 

    // Transmit outbound buffer 
} 
+0

Este código funcionó muy bien para mí. Muchas gracias por tu ayuda. –

-1

Usted parece haber roto su tarea lógicamente, después de todo, usted ha descrito de manera coherente con palabras . Ahora solo haz que tu código lo haga.

pseudo código podría ser algo como:

while (there are chunks in incoming array) 
    copy 1 chunk to outbound array 
    create uploadObject 
    call webservice 
endwhile 
4

Es posible que desee Buffer.BlockCopy (la más cruda de las copias, idealmente adecuado para byte[]).

Por supuesto, la otra opción es utilizar un MemoryStream en lugar de la matriz de salida, y justo Write a ella cada vez, a continuación, llamar ToArray() o GetBuffer() en el MemoryStream (con GetBuffer(), que necesita para ver la longitud; con ToArray() se recorta de forma automática):

MemoryStream ms = new MemoryStream(); 
byte[] buffer = new byte[BUFFER_SIZE]; 
int bytesReceived; 
while((bytesReceived = GetNextChunk(buffer, 0, BUFFER_SIZE)) > 0) { 
    ms.Write(incomingArray, 0, bytesReceived); 
} 
byte[] final = ms.ToArray(); 
0

Tenga cuidado con llamar a servicios web en un bucle de forma sincrónica. Las llamadas de servicio web síncrono tardan un tiempo indefinido debido a la naturaleza de HTTP y su bucle puede funcionar durante mucho tiempo. Es preferible usar un enfoque asincrónico.

Cuestiones relacionadas