2009-09-01 13 views
5

मेरे पास मेरे आवेदन में एक कार्यकर्ता धागा है जो तीन अलग-अलग चीजों के लिए ज़िम्मेदार है। दो नौकरियों के लिए अनुरोध मैंने जो पंक्तियां लिखी हैं, उसमें बदलती है, जब नेटवर्क स्ट्रीम पर अनुरोध चालू होता है तो अन्य नौकरी सक्रिय होती है। मैं अपने कार्यकर्ता थ्रेड को इंतजार करना चाहता हूं जब कोई काम नहीं किया जाए। यह दो पंक्तियों के साथ आसान है क्योंकि वे मैन्युअल रीसेट इवेंट का पर्दाफाश करते हैं जो उनके पास आइटम होते हैं, हालांकि नेटवर्कस्ट्रीम में ऐसा प्रतीत नहीं होता है। नेटवर्कस्ट्रीम को टीसीपी क्लाइंट से पुनर्प्राप्त किया गया है।डेटा स्ट्रीम पढ़ने के लिए नेटवर्क स्ट्रीम के लिए आप कैसे प्रतीक्षा करते हैं?

क्या मैं के बाद कर रहा हूँ कोड है कि कुछ इस तरह दिखता है:

while (notDone) 
{ 
    WaitHandle.WaitAny(new WaitHandle[] { queue1.HasData, queue2.HasData, netStream.HasData }); 
    // ... 
    if (netStream.DataAvailable) 
    { 
     netStream.Read(buffer, 0, 20); 
     // process buffer 
    } 
} 

किसी को भी एक WaitHandle जब एक NetworkStream डेटा है सेट कर दिया जाता है कि प्राप्त करने के लिए एक तरह से पता है?

उत्तर

7

आप नेटवर्कस्ट्रीम के एसिंक विधियों का उपयोग कर सकते हैं और EndReceive विधि में मैन्युअल रीसेट इवेंट सेट कर सकते हैं।

// ... 
netStream.BeginRead(buffer, offset, callback, state); 
// ... 

कॉलबैक विधि

netStream.EndRead(ar); 
netStreamManualResetEvent.Set(); 

अंदर फिर अपना कोड

while (notDone) 
{ 
    WaitHandle.WaitAny(new WaitHandle[] { queue1.HasData, queue2.HasData, netStreamManualResetEvent}); 
    // ... 
    if (netStream.DataAvailable) 
    { 
     // make the buffer from the AsyncState in the callback method available here 
     // process buffer 
    } 
} 
+0

यह संभव शून्य बाइट्स पढ़ने के लिए BeginRead प्राप्त करने के लिए है? –

+0

यदि रिमोट होस्ट कनेक्शन को बंद कर देता है और 0 बाइट्स उपलब्ध नहीं होगा तो कोई और डेटा उपलब्ध नहीं होगा। तुमने क्यों पूछा? – SpaceghostAli

+0

यदि आप BeginRead को शून्य बाइट्स नहीं पढ़ सकते हैं तो आप मुख्य लूप और कॉल बैक के बीच पढ़ने वाले बफर को प्रबंधित करना शुरू कर देते हैं। यह पूरी तरह से करने योग्य है लेकिन जैसा कि मैं चाहूंगा उतना अच्छा नहीं है। –

2

सबसे आसान तरीका शायद एक अतिरिक्त थ्रेड का उपयोग करना है जो सिंक्रनाइज़ रूप से पढ़ता है और अतिरिक्त डेटा को अतिरिक्त कतार पर रखता है।

वैकल्पिक रूप से आप एसिंक्रोनस आईओ का उपयोग कर सकते हैं, लेकिन यह कुछ हद तक मुश्किल है - और आपको अभी भी कुछ अतिरिक्त कतार की आवश्यकता होगी।

हालांकि Socket एक Select() विधि है (और आप एक NetworkStream से एक सॉकेट पर प्राप्त कर सकते हैं) मैं नहीं मानता कि यह एक तरह से आप इंतजार हैंडल के अन्य प्रकार के साथ मिला देता है, जिसमें इस कार्यक्षमता को उजागर करता है।

संबंधित मुद्दे