2009-02-24 6 views
8

私の関数に渡される大きなバイト配列を処理する必要があります。この入力バイト配列のコンテンツをより小さな "チャンク"でアウトバウンドバイト配列にコピーする必要があります。バイト配列からチャンクをコピーするループが必要です

アウトバウンド配列で作成されたデータのすべてのチャンクについて、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 
} 

私はこれが混乱していて動作しないことを知っています。誰かがこれを行うために適切なループをスケッチすることができますか?どうもありがとう。

答えて

17

あなたは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 
} 
+0

このコードは私のためにうまく働きました。手伝ってくれてどうもありがとう。 –

-1

はあなたが論理的にあなたのタスクを分解しているように見える、結局、あなたはコヒーレント言葉でそれを説明してきました。今すぐあなたのコードをそれにしてください。

擬似コードのようなものかもしれません:

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

おそらくBuffer.BlockCopy(コピーのrawest; byte[]に理想的に適している)します。もちろん

、他のオプションは、アウトバウンド配列の代わりにMemoryStreamを使用することで、ちょうどWriteそれまで毎回、その後、GetBuffer()で(MemoryStreamToArray()または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(); 
0

は同期ループ内でウェブサービスを呼び出すには注意が必要です。同期Webサービス呼び出しは、HTTPの性質上、不定期になり、ループが長時間実行される可能性があります。非同期アプローチを使用することが好ましい。

関連する問題