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.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
 }
于 2009-02-24T22:51:36.873 に答える
4

あなたはおそらくBuffer.BlockCopy(最も生のコピー; 理想的には に適していますbyte[]).

もちろん、他のオプションはMemoryStream、アウトバウンド配列の代わりにa を使用し、Write毎回それを使用してから、 ToArray()orGetBuffer()を呼び出すことです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 に答える