2012-01-07 6 views
10

मैं सामान्य तरीके से उपयोग करने के लिए कुछ विधि बनाना चाहता हूं, जब तक किसी दिए गए शर्त को पूरा नहीं किया जाता है तब तक यह ब्लॉक (जब तक कोई निश्चित टाइमआउट समाप्त नहीं हो जाता)।कुछ शर्तों को पूरा करने तक "ब्लॉक" करने का सर्वोत्तम तरीका

कोड में उपयोग करने के लिए कुछ इसी तरह होगा:

WaitUntil(condition); 

मैं एक ओर जहां (..) पाश का उपयोग कर इसे लागू करने की कोशिश की है, लेकिन इस बर्बादी की तरह लगता है।

वर्तमान कार्यान्वयन में, मैं एक 'ऑफ-ऑफ' टाइमर शुरू कर रहा हूं जो TIMEOUT पर समाप्त हो जाता है। मैं थोड़ी देर लूप चला रहा हूं, और जांच कर रहा हूं कि टाइमर का समय समाप्त हो गया है या नहीं, अगर ऐसा हुआ तो अपवाद फेंक रहा है।

क्या ऐसी विधि को लागू करने के लिए कोई सरल लेकिन प्रभावी तकनीक है?

+0

मैं प्रतिनिधियों और घटनाओं – Joe

+3

Mutex, सेमाफोर, ManualResetEvent, AutoResetEvent, CountdownEvent आदि System.Threading नाम स्थान –

+3

कह अधिक तकनीकी रूप से आप कुछ पर सिंक्रनाइज़ करना चाहते हैं को देखो इस पर गौर करेंगे। ऑपरेटिंग सिस्टम तंत्र प्रदान करता है जो लूप के दौरान व्यस्त प्रतीक्षा से बचने की अनुमति देता है। Yoy में विकल्पों की संख्या है: सेमफोर, महत्वपूर्ण अनुभाग, मैनुअल/ऑटो रीसेट घटना और अधिक। एक को चुनने के लिए आपको कहना चाहिए कि वह कंडीशनिंग है जिसके लिए आप प्रतीक्षा कर रहे हैं। सिंक्रनाइज़ेशन के लिए एक सामान्य फ़ंक्शन WaitForSingleObject है। – pkmiec

उत्तर

4

किसी शर्त के लिए अवरुद्ध करना (मैं व्यक्तिगत रूप से मॉनीटर का उपयोग करना चाहता हूं), हालांकि, ज्यादातर मामलों में मैं यहां एक और एसिंक तरीके से कोडिंग की सलाह दूंगा, जिसका अर्थ है: प्रतीक्षा करने के बजाय, आप किसी प्रकार का कॉलबैक पंजीकृत करते हैं स्थिति होती है जब स्थिति होती है। यह एक घटना के माध्यम से हो सकता है, या हाल ही में निरंतरता (जारी रखें) के साथ एक कार्य। सी # 5 में इसे "प्रतीक्षा" रूपक के साथ आगे बढ़ाया गया है जो इस पारदर्शी बनाता है, यानी।

var foo = StartSomeWork(); 
... 
var result = await foo; 
Console.WriteLine(result); 

यह लगता है कि यह कम से "का इंतजार है" ब्लॉक कर रहा है - लेकिन यह वास्तव में ठीक विपरीत है (कार्य संभालने पहले से ही पूरा नहीं हुआ है); यह एक निरंतरता पंजीकृत करता है जिसे कहा जाता है जब डेटा उपलब्ध हो जाता है, अधिकतर एक अलग थ्रेड पर संभवतः।

+1

+1 async – diggingforfire

+0

का उल्लेख करने के लिए +1 इस कोड के साथ एकमात्र समस्या यह है: हम .NET 3.5 का उपयोग कर रहे हैं, और संस्करण 5 अभी तक बाहर नहीं है :) क्या सीटीपी 3.5 पर काम करता है? (मुझे ऐसा नहीं लगता)। –

+0

@liortal आप 4.0 पर जारी रखें का उपयोग कर सकते हैं; मैं उत्पादन कोड –

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

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