2012-11-17 16 views
72

मैं प्रतीक्षा/नींद प्रतिमान के आधार पर एक नेटवर्क-बाध्य आवेदन लिख रहा हूं।प्रतीक्षा करने योग्य थ्रेड कैसे प्राप्त करें। सो जाओ?

कभी-कभी, कनेक्शन त्रुटियां होती हैं, और मेरे अनुभव में यह कुछ समय इंतजार करने और फिर से प्रयास करने की अपेक्षा करता है।

समस्या यह है कि अगर मैं थ्रेड स्लीप या कुछ समान ब्लॉकिंग ऑपरेशन का इंतजार/async में उपयोग करता हूं, तो यह कॉलर थ्रेड में सभी गतिविधियों को अवरुद्ध करता है।

क्या मैं

await Thread.SleepAsync(10000) 

के रूप में एक ही प्रभाव acheave के साथ Thread.Sleep (10000) को प्रतिस्थापित करना चाहिए?

अद्यतन

मैं एक जवाब है जो किसी भी अतिरिक्त धागे

उत्तर

186

एक नया धागा शुरू करने का सुझाव दे अन्य उत्तर बनाए बिना यह करता है पसंद करेंगे एक बुरा विचार कर रहे हैं - सब पर ऐसा करने की कोई आवश्यकता नहीं है । async/await के बिंदु का हिस्सा को आपके आवेदन की जरूरतों की संख्या को कम करता है।

आप के बजाय का उपयोग करना चाहिए Task.Delay जो एक नया धागा की आवश्यकता नहीं है, और इस उद्देश्य के लिए ठीक डिजाइन किया गया था:

// Execution of the async method will continue one second later, but without 
// blocking. 
await Task.Delay(1000); 
+0

मैं अभी भी a4.5 सामान के साथ पकड़ के आ रहा हूँ। उस कथन के बाद कोड पर निष्पादन की शाखा कहां है? क्या गैर-नींद/अवरुद्ध भाग इसे निष्पादित करता है या 'थ्रेड' इंतजार करता है? क्या मुख्य गैर-अवरुद्ध निष्पादन केवल ब्लॉक (उर्फ रिटर्न) को छोड़ देता है? – kenny

+0

हाँ। यह वास्तव में मुझे –

+1

@ केनी की आवश्यकता है: आपको मेरा ['async' परिचय] (http://nitoprograms.blogspot.com/2012/02/async-and-await.html) उपयोगी हो सकता है। जब 'टास्क। डेले' द्वारा लौटाया जाने वाला प्रतीक्षा करने योग्य 'प्रतीक्षा' होता है, क्योंकि यह पूरा नहीं होता है, तो वर्तमान विधि एक अपूर्ण कार्य देता है। बाद में, जब 'देरी' पूरा हो जाता है (टाइमर बंद होता है, धागा नहीं), शेष विधि को चलाने के लिए निर्धारित किया जाता है। निरंतरता एक "संदर्भ" में चलती है जो * * * उसी मूल धागे पर वापस आ सकती है - मेरे ब्लॉग पर विवरण। –