我必须处理一个传递给我的函数的大字节数组。我需要将来自此传入字节数组的内容以较小的“块”复制到出站字节数组。
对于在出站阵列中创建的每个“数据块”,我需要调用一个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
}
我知道这是一团糟,不会奏效;有人可以草拟一个合适的循环来完成这项工作吗?非常感谢。
答案 0 :(得分:18)
您可能希望查看Array.Copy或Buffer.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
}
答案 1 :(得分:4)
您可能需要Buffer.BlockCopy
(最简单的副本;最适合byte[]
)。
当然,另一个选择是使用MemoryStream
代替出站数组,每次只使用Write
,然后调用ToArray()
或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();
答案 2 :(得分:3)
为什么不使用Array.Copy? http://msdn.microsoft.com/en-us/library/system.array.copy.aspx
例如
Array.Copy(srcBuffer, destBuffer, 1024);
答案 3 :(得分:0)
警惕同步循环调用Web服务。由于HTTP的性质,同步Web服务调用会花费无限时间,并且您的循环可能会运行很长时间。最好使用异步方法。
答案 4 :(得分:-2)
你似乎在逻辑上打破了你的任务,毕竟,你已经用文字连贯地描述了它。现在让你的代码去做吧。
伪代码可能类似于:
while (there are chunks in incoming array)
copy 1 chunk to outbound array
create uploadObject
call webservice
endwhile