2009-10-08 22 views
7

मैं एक एसिंक्रोनस ऑपरेशन (नेटवर्क आईओएस की एक श्रृंखला) पर एक टाइमआउट लागू कर रहा हूं, और मुझे यकीन नहीं है कि 'बेहतर' (आवंटन/प्रदर्शन से) परिप्रेक्ष्य: एक बनाना EventWaitHandle और RegisterWaitForSingleObject का उपयोग करके, या बस एक टाइमर बनाना और इसकी टिक का उपयोग करना।नेट टाइमआउट्स: WaitForSingleObject बनाम टाइमर

मेरे विशिष्ट मामले में EventWaitHandle आलसी-निर्मित है, लेकिन स्पष्ट रूप से इसे WaitForSingleObject का उपयोग करने के लिए तत्काल होना होगा। तो वास्तव में यह एक WaitHandle + WaitForSingleObject बनाम टाइमर की संसाधन लागत के बारे में एक सवाल है। दोनों दृष्टिकोण लागू करने के लिए आसान हैं।

मैंने कई बार लागू किया है, इसलिए मैं इलाके को समझता हूं, मुझे यकीन नहीं है कि कौन सा दृष्टिकोण 'बेहतर' है।

उत्तर

3

माइक्रोसॉफ्ट के मॉर्गन स्किनर seems to prefer RegisterWaitForSingleObject

जहां तक ​​आवंटन का संबंध है, परावर्तक पता चलता है कि RegisterWaitForSingleObject, एक RegisteredWaitHandle का एक उदाहरण बनाने, जबकि एक टाइमर एक आंतरिक TimerBase, साथ ही _TimerCallback नाम के एक वर्ग पैदा करता है। कोई भी इन वर्गों के आकारों की तुलना और तुलना कर सकता है, लेकिन वे अधिक निर्भरता प्रतीत होते हैं, विशेष रूप से अप्रबंधित (दोनों अंतर्निहित Win32 फ़ंक्शंस का उपयोग करते हैं) - इसलिए मैं वास्तव में सीधे जवाब नहीं दे सकता।

प्रतीक्षा संभाल के बारे में RegisterWaitForSingleObject पर पास किया गया है, ध्यान रखें कि आप एक एकल मौनल/ऑटोरसेट इवेंट आवंटित कर सकते हैं और सभी कॉलों को पास कर सकते हैं (क्योंकि आप टाइमआउट पर गिन रहे हैं, इसलिए आप इसे कभी भी संकेत नहीं देंगे) ।

जहां तक ​​प्रदर्शन चलता है, मुझे यकीन नहीं है। थ्रेडपूल RegisterWaitForSingleObject के माध्यम से पंजीकृत प्रत्येक 63 कार्यों के लिए एक विशेष प्रतीक्षा धागा का उपयोग करेगा। इसके विपरीत, एक टाइमर अंतर्निहित Win32 टाइमर का उपयोग करेगा। दोनों वास्तविक निष्पादन के लिए थ्रेडपूल कार्यकर्ता थ्रेड का उपयोग कर समाप्त हो जाएंगे। कौन सा परिदृश्य बेहतर है? मुझे बीट्स .. इसलिए मैं इस पर स्किनर के साथ जाना चाहते हैं :)

यह भी देखें:

+0

उनके ब्लॉग आलेख का एक उपयोग की अच्छी तुलना, लेकिन एक बनाम दूसरे के पक्ष में एक बहुत मजबूत सिफारिश नहीं है। और जितना मैंने सोचा, उतना ही मैं कर्नेल संक्रमणों के मामले में कोई अंतर नहीं देख सका। मैं अभी भी जानना चाहता हूं कि अंतर्निहित Win32 API के लिए कोई अंतर अंतर था, लेकिन .net कार्यान्वयन का 'वज़न' मुझे सबसे अच्छा जवाब जैसा लगता है। – piers7

1

कोई भी बेहतर नहीं है। समय-समय पर कुछ करने के लिए आपके धागे को "पोक" करने के लिए एक टाइमर का उपयोग किया जाता है। WaitForSingleObject हैंडल पर इंतजार कर रहा है। टाइमआउट वहां है ताकि आप डेडलॉक में फंसने की बजाय प्रतीक्षा करना बंद कर सकें। यदि आप टाइमआउट का उपयोग करते हैं तो लॉक से waitforsingleobject को तोड़ने के लिए टाइमर का उपयोग करना आवश्यक नहीं है।

संसाधन लागत दोनों के लिए नगण्य है। मैं नहीं कह सकता कि आपको किस दृष्टिकोण का उपयोग करना चाहिए क्योंकि यह आपके पास कोड की स्थिति पर अत्यधिक निर्भर है।

+2

मैं सहमत नहीं हूँ। यह एक सीधा सवाल है: एक टाइमर बनाम लागत आवंटित करने की लागत एक प्रतीक्षाथल और WaitForSingleObject आवंटित करने की लागत। वे दोनों ओएस संसाधन हैं। मेरी स्थिति के बावजूद, किसी को दूसरे से अधिक खर्च करना चाहिए। और इस परिदृश्य में मैं एक 'एक ऑफ' टाइमर के बारे में बात कर रहा हूं, * दोनों * को आपके कोड को समय-समय पर 'पोक' करने के लिए उपयोग किया जा सकता है - आप RegisterWaitForSingleObject पर 'executeOnlyOnce' ध्वज का उपयोग कर सकते हैं ... – piers7

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