कैसे प्रतीक्षा करें थ्रेड प्राप्त करें। सोएं?


139

मैं प्रतीक्षित / नींद प्रतिमान के आधार पर एक नेटवर्क-बाउंड एप्लिकेशन लिख रहा हूं।

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

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

मुझे उसी प्रभाव को प्राप्त करने के लिए थ्रेड स्लीप (10000) को बदलना चाहिए

await Thread.SleepAsync(10000)

?

अपडेट करें

मैं एक उत्तर देना पसंद करूंगा, जो बिना किसी अतिरिक्त धागे का निर्माण करता है

जवाबों:


323

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

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

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

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

1
हाँ। यह वही है जो मुझे चाहिए
आर्सेन ज़ाहरे

1
@ पैसा: आपको मेरा asyncपरिचय मददगार लग सकता है । जब awaitable द्वारा दिया Task.Delayजाता है awaitएड, यह पूरा नहीं हुआ है, क्योंकि, वर्तमान पद्धति एक अधूरी काम देता है। बाद में, जब Delayपूर्ण (एक टाइमर, एक धागा नहीं) बंद हो जाता है, तो शेष विधि को चलाने के लिए निर्धारित किया जाता है। निरंतरता एक "संदर्भ" में चलती है जो उसी मूल धागे पर लौट सकती है - मेरे ब्लॉग पर विवरण।
स्टीफन क्लीयर

@StephenCleary इसके लिए धन्यवाद। तो क्या मैं यह कहने में सही हूं कि प्रतीक्षा के बाद का कोड निष्पादन के लिए for शेड्यूल ’है और कॉलिंग थ्रेड रिटर्न?
केनी

2
हां, कॉलिंग थ्रेड रिटर्न (तुरंत) और कोड awaitअनुसूचित होने के बाद (अंततः) है।
स्टीफन क्लीयर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.