2009-02-24 8 views
8

से भाग कॉपी करने के लिए लूप की आवश्यकता है मुझे अपने फ़ंक्शन में पारित एक बड़ी बाइट सरणी को संसाधित करना होगा। मुझे इस आने वाली बाइट सरणी से सामग्री को छोटे "भाग" में आउटबाउंड बाइट सरणी में कॉपी करने की आवश्यकता है।बाइट सरणी

आउटबाउंड सरणी में बनाए गए डेटा के हर "खंड" के लिए, मुझे एक वेब सेवा कॉल करने की आवश्यकता है।

वापसी पर, मुझे आने वाली बाइट सरणी के माध्यम से लूपिंग फिर से शुरू करने की आवश्यकता है, पूर्ण आने वाली सरणी संसाधित होने तक डेटा का पूरा या आंशिक हिस्सा पारित करना जारी रखें (यानी भाग में वेब सेवा में भेजा जाता है)।

मैं सी # के लिए बहुत नया हूं और मैं काम करता हूं कि एक लूप के साथ संघर्ष कर रहा हूँ। मुझे पता है कि एक "खंड" को संभालने के लिए वेब सेवा को कैसे कॉल करें, लेकिन मुझे लूपिंग सही नहीं मिल सकता है। यहां वर्तमान में दयनीय गड़बड़ी का एक स्केच है:

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 हर बार, तो पर 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(); 
0

तुल्यकालिक एक पाश में वेब सेवाओं बुला से सावधान रहें। सिंक्रोनस वेब-सेवा कॉल HTTP की प्रकृति के कारण अनिश्चित समय लेते हैं और आपका लूप लंबे समय तक चल सकता है। एसिंक्रोनस दृष्टिकोण का उपयोग करना बेहतर है।