需要循环从字节数组中复制块。

10
我需要处理一个传递给我的函数的大字节数组。我需要将这个传入的字节数组中的内容以较小的“块”复制到一个出站字节数组中。
对于在出站数组中创建的每个数据“块”,我需要调用一个Web服务。
返回后,我需要继续循环遍历传入的字节数组,继续传递整个或部分数据块,直到完整的传入数组被处理(即以块形式发送到Web服务)。
我非常新手C#,我正在努力编写有效的循环。我知道如何调用Web服务来处理数据“块”,但我无法正确进行循环。以下是我目前拥有的可悲混乱代码的草图:
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 
 }

我知道这是一团糟并且行不通;有人能勾勒出一个适当的循环来完成这个任务吗?非常感谢。

5个回答

22

你可以考虑使用Array.CopyBuffer.BlockCopy;这样可以简化代码,因为你不必逐个复制每个字节:

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
 }

这段代码对我非常有效。非常感谢你的帮助。 - John Adams

4
您可能需要使用Buffer.BlockCopy(最原始的复制方式;最适合byte[])。
当然,另一个选择是使用MemoryStream代替输出数组,每次只需向其Write,然后在MemoryStream上调用ToArray()GetBuffer()(对于GetBuffer(),您需要注意长度;对于ToArray(),它会自动为您修剪):
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();

3

0

注意不要在循环中同步调用 Web 服务。由于 HTTP 的性质,同步 Web 服务调用需要无限的时间,而你的循环可能会运行很长时间。最好使用异步方法。


-2

看起来你已经很好地将任务进行了逻辑分解,毕竟,你用言辞清晰地描述了它。现在你需要让你的代码去实现。

伪代码可能是这样的:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接