2012-05-24 13 views
10

मेरे आवेदन को ठंडा करने के बाद मैंने Task.Delay() (या TaskEx.Delay() द्वारा .NET 4.0 में बनाए गए कार्य पर प्रतीक्षा किए गए थ्रेड के कारण को ट्रैक किया) जिसके लिए यह एक बग के कारण TimeSpan की गणना की गई, जिसे TimeSpan पर गणना की गई थी TotalMilliseconds-1 से कम या उसके बराबर और -2 से अधिक (यानी -10000 से -19 999 टिकों के बीच कहीं भी) शामिल है।कार्य क्यों करता है। डेले() एक अनंत देरी की अनुमति देता है?

ऐसा लगता है कि जब आप एक नकारात्मक TimeSpan-2 मिलीसेकंड या कम है कि गुजरती हैं, विधि सही ढंग से एक ArgumentOutOfRangeException फेंकता है, लेकिन जब आप रेंज ऊपर वर्णित से एक नकारात्मक TimeSpan प्रदान करते हैं यह एक Task कि कभी नहीं पूरा करती रिटर्न (स्थापना करके अंतर्निहित System.Threading.Timer एक dueTime -1 -1 जो ​​अनंतता को दर्शाता है)। इसका मतलब है कि उस कार्य पर सेट की गई कोई भी निरंतरता कभी निष्पादित नहीं होगी, और .Wait() पर होने वाले किसी भी खराब धागे को Task पर हमेशा अवरुद्ध कर दिया जाएगा।

Task क्या संभव उपयोग संभव नहीं है? क्या कोई इस तरह के वापसी मूल्य की उम्मीद करेगा? .Delay() पर कोई नकारात्मक मूल्य पारित नहीं होना चाहिए, जिसमें उस विशेष सीमा में मूल्य शामिल हैं, ArgumentOutOfRangeException फेंक दें?

+1

एमएसडीएन दस्तावेज़ -1 की अनुमति देने में काफी स्पष्ट है, इसलिए ऐसा लगता है कि यह सही ढंग से व्यवहार कर रहा है। उस अधिभार के उपयोग के मामले के बारे में निश्चित नहीं है, लेकिन यह अधिभार टोकन लेने वाले अधिभार के साथ 'बस' रद्दीकरण की प्रतीक्षा करने का एक तरीका हो सकता है। –

+0

@ जेम्स: यह -1 को अनुमति देने में स्पष्ट नहीं है, यह -1 से कम मानों को अस्वीकार करने में स्पष्ट है। यह भी नहीं कहता है कि यदि आप -1 सिस्टम पास करते हैं, तो 'सिस्टम। थ्रेडिंग टिमर' के दस्तावेज़ के विपरीत क्या होगा। यह लगभग प्रकट होता है जैसे अपवाद की दस्तावेजी सूची स्वचालित रूप से स्रोत कोड से उत्पन्न होती है। और यदि आप 'बस' रद्दीकरण की प्रतीक्षा कर रहे हैं, तो 'टास्क.डेले() 'पर कॉल क्यों करें? –

+0

यदि आपको लगता है कि यह टूट गया है, तो कनेक्ट पर एक बग दर्ज करें। एक डॉक्टर जो कहता है "-1 से कम अमान्य है" स्पष्ट है (मेरे लिए) यह कहकर कि -1 मान्य है। यदि इरादा -1 के रूप में अमान्य था "0 से कम अमान्य है" लिखना आसान होता। चूंकि दस्तावेज़ और कोड दोनों अनुमति देते हैं -1, मुझे लगता है कि यह डिज़ाइन द्वारा है, लेकिन कनेक्ट पर एक बग फ़ाइल करने के लिए स्वतंत्र महसूस करें (बीसीएल टीम द्वारा यादृच्छिक एसओ थ्रेड की तुलना में संसाधित होने की अधिक संभावना है, मुझे लगता है :) –

उत्तर

7

Timeout.Infinite या -1 उपयोगी है जब आप लंबे समय से चलने वाले कार्य के लिए अनिश्चित काल तक प्रतीक्षा करना चाहते हैं जो पूर्ण करने के लिए अनिश्चित समय लेगा, लेकिन अंत में पूरा हो जाएगा।

Win32 API अनंत टाइमआउट के लिए निरंतर INFINITE = -1 का भी उपयोग करता है।

आप सामान्य रूप से इसे यूआई थ्रेड में उपयोग नहीं करना चाहते हैं, क्योंकि यह यूआई को फ्रीज कर सकता है (जो आपकी समस्या है)। लेकिन एक कार्यकर्ता धागे में वैध उपयोग के मामले हैं - उदा। एक सर्वर जो क्लाइंट से कनेक्शन के लिए प्रतीक्षा कर रहा है अवरुद्ध कर रहा है।

+0

एक अनंत टाइमआउट उपयोगी है। एक अनंत देरी नहीं है (और इसलिए आप पहले पैराग्राफ लागू नहीं होते हैं)। दुनिया में क्या आप हमेशा के लिए देरी करना चाहते हैं? आप इसे भी प्रदर्शन नहीं कर सकते हैं। यह सिर्फ मुझे कोई समझ नहीं आता है कि '-1' का कार्यान्वयन विवरण 'टास्क.डिले()' विधि तक 'सिस्टम। थ्रेडिंग टिमर' (या Win32 टाइमर) से प्रचारित किया जाएगा।यह डेवलपर्स को "सफलता का गड्ढा" में धकेलने के माइक्रोसॉफ्ट के डिजाइन सिद्धांत के विपरीत है, जब तक कि कुछ उपयोग के मामले में मुझे पता नहीं है। –

+0

इसके अलावा, मैं इसे यूआई थ्रेड में उपयोग नहीं कर रहा हूं। यह एक विंडोज सेवा है जिसे रोकने के लिए कहा जाता है, इसे एक [टीएपी] (http://www.microsoft.com/en-us/download/details.aspx?id=19957) -बैड विधि को कॉल करके शट डाउन रूटीन करना होगा जो दौड़ने में बहुत लंबा समय ले सकता है, इसलिए यह एक देरी कार्य भी बनाता है जो मजबूर शट डाउन करेगा। इसके बाद यह दोनों कार्यों पर '.WaitAny() 'करता है, और चूंकि मूल कार्य में बहुत लंबा समय लगता है और देरी कार्य कभी पूरा नहीं होगा (अपवाद फेंकने के बजाय), सेवा लटकने लगी। –

+1

क्लाइंट से कनेक्शन के लिए प्रतीक्षा करने वाले सर्वर को कैसे 'टास्क' का उपयोग करना होगा जो कभी पूरा नहीं होता? क्या आप एक उदाहरण दिखा सकते हैं? –

2

मजाक करने वाले परिदृश्यों में, जहां मैं यह सुनिश्चित करना चाहता हूं कि मेरा कोड एक कार्य में है। जब कोई() ब्लॉक सही ढंग से इंतजार कर रहे कार्यों में से एक को संभाला जा रहा है, तो मैं अन्य कार्यों का मज़ाक उड़ा सकता हूं और कार्य सुनिश्चित करने के लिए अनंत देरी का उपयोग कर सकता हूं जब कोई काम को संसाधित कर रहा है तो मैंने अनंत देरी के रूप में नकली नहीं किया।

+2

दिलचस्प उपयोग-मामला, हालांकि मुझे लगता है कि यह कभी भी समाप्त होने वाला कार्य प्रदान करने के लिए 'नया कार्य पूर्णीकरण स्रोत()। कार्य 'का उपयोग करने के लिए अधिक स्पष्ट और स्पष्ट होगा। –

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

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