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 
 }

我知道这是一团糟,而且行不通;有人可以绘制一个适当的循环来完成这项工作吗?非常感谢。

4

5 回答 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
 }
于 2009-02-24T22:51:36.873 回答
4

您可能想要Buffer.BlockCopy(最原始的副本;非常适合byte[])。

当然,另一种选择是使用 aMemoryStream代替出站数组,Write每次只使用它,然后调用ToArray()or GetBuffer()MemoryStream使用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();
于 2009-02-24T22:58:22.287 回答
3

为什么不直接使用 Array.Copy? http://msdn.microsoft.com/en-us/library/system.array.copy.aspx

例如。

Array.Copy(srcBuffer, destBuffer, 1024);
于 2009-02-24T23:13:05.760 回答
0

小心在循环中同步调用 Web 服务。由于 HTTP 的性质,同步 Web 服务调用需要无限时间,并且您的循环可能会运行很长时间。最好使用异步方法。

于 2009-02-24T22:58:47.730 回答
-2

你似乎已经逻辑地分解了你的任务,毕竟你已经用文字连贯地描述了它。现在只需让您的代码执行此操作。

伪代码可能类似于:

while (there are chunks in incoming array)
    copy 1 chunk to outbound array
    create uploadObject
    call webservice
endwhile
于 2009-02-24T22:55:51.200 回答