2012-12-12 11 views
7

मैं सी # का उपयोग कर ट्विटर स्ट्रीम एपीआई से डेटा पढ़ने की कोशिश कर रहा हूं, और कभी-कभी एपीआई कोई डेटा नहीं लौटाएगा, और मैं निकट-वास्तविक प्रतिक्रिया की तलाश में हूं, अगर पाठ अगले दिन या दो के लिए कोई और डेटा नहीं लौटाता है तो पाठक पर 1 से अधिक बाइट की बफर लंबाई का उपयोग करने में संकोच कर रहा हूं।एक समय में एक बाइट पढ़ने के बिना एक HTTP स्ट्रीम का उपभोग

मैं निम्न पंक्ति का उपयोग कर रहे हैं:

input.BeginRead(buffer, 0, buffer.Length, InputReadComplete, null); 
//buffer = new byte[1] 

अब जब कि मैं आवेदन पैमाने करने की योजना है, मुझे लगता है कि 1 के एक आकार CPU उपयोग का एक बहुत में परिणाम होगा, और कहा कि संख्या में वृद्धि करना चाहते हैं , लेकिन मैं अभी भी स्ट्रीम को बस ब्लॉक करना नहीं चाहता हूं। क्या अगले 5 सेकंड में कोई और बाइट पढ़ा नहीं जाता है या कुछ समान होने पर स्ट्रीम वापस लौटना संभव है?

उत्तर

4

Async विकल्प

आप इस कार्य को पूरा करने के लिए अगर कोई बाइट्स उदा के लिए प्राप्त कर रहे हैं async कॉलबैक विधि में एक टाइमर का उपयोग कर सकते 5 सेकंड। हर बार बाइट प्राप्त होने पर टाइमर रीसेट करें। BeginRead से पहले इसे शुरू करें।

सिंक विकल्प

वैकल्पिक रूप से, आप पढ़ने के पूरा करने से पहले प्रतीक्षा करने के लिए एक अधिक से अधिक समय की स्थापना के लिए अंतर्निहित सॉकेट की ReceiveTimeout संपत्ति का उपयोग कर सकते हैं। आप एक बड़े बफर का उपयोग कर सकते हैं और समय-समय पर सेटआउट सेट कर सकते हैं 5 सेकंड।

MSDN documentation से यह संपत्ति केवल एक तुल्यकालिक पढ़ने पर लागू होती है। आप एक अलग धागे पर एक तुल्यकालिक पढ़ने कर सकते हैं।

अद्यतन

यहाँ किसी न किसी तरह, अपरीक्षित कोड एक ऐसी ही समस्या से में इकट्ठा है। यह शायद नहीं चलेगा (या बग-मुक्त होना) के रूप में-है, लेकिन आप से पता चलना चाहिए:

private EventWaitHandle asyncWait = new ManualResetEvent(false); 
private Timer abortTimer = null; 
private bool success = false; 

public void ReadFromTwitter() 
{ 
    abortTimer = new Timer(AbortTwitter, null, 50000, System.Threading.Timeout.Infinite); 

    asyncWait.Reset(); 
    input.BeginRead(buffer, 0, buffer.Length, InputReadComplete, null); 
    asyncWait.WaitOne();    
} 

void AbortTwitter(object state) 
{ 
    success = false; // Redundant but explicit for clarity 
    asyncWait.Set(); 
} 

void InputReadComplete() 
{ 
    // Disable the timer: 
    abortTimer.Change(System.Threading.Timeout.Infinite, System.Threading.Timeout.Infinite); 
    success = true; 
    asyncWait.Set(); 
} 
+0

मैं सिर्फ उद्घाटन और क्योंकि ट्विटर की नीतियों के संबंध को बंद रखने नहीं कर सकता। क्या आप उदाहरण के लिए जल्दी से समाप्त करने के लिए एसिंक कॉलबैक टाइमर का उपयोग कैसे कर सकते हैं इसका एक उदाहरण दे सकते हैं? – HenryZhang

+0

@huadianz: आपको एक प्रारंभिक बिंदु देने के लिए एक मोटा उदाहरण जोड़ा गया। –

+0

क्या रीड बफर में कोई डेटा लौटाता है, या वह डेटा खो गया है? – HenryZhang