2012-01-10 17 views
8

का स्वीकार्य उपयोग मैं एक कंसोल एप्लिकेशन पर काम कर रहा हूं जो निर्धारित अंतराल पर निर्धारित और चलाएगा, हर 30 मिनट में कहें। इसका एकमात्र उद्देश्य डेटाबेस पंक्तियों के बैच को अद्यतन करने के लिए वेब सेवा से पूछना है।थ्रेड स्लीप()

वेब सेवा एपीआई एक सेट अंतराल के बाद समय समाप्त एक बार हर 30 सेकंड बुला reccommends, और। निम्नलिखित स्यूडोकोड एक उदाहरण के रूप में दिया जाता है:

listId := updateList(<list of terms>) 
LOOP 
    WHILE NOT isUpdatingComplete(listId) 
END LOOP 
statuses := getStatuses(“LIST_ID = {listId}”) 

मैं के रूप में इस मोटे तौर पर सी में # कोडित है

int callCount = 0; 
while(callCount < 5 && !client.isUpdateComplete(listId, out messages)) 
{ 
    listId = client.updateList(options, terms, out messages); 
    callCount++; 
    Thread.Sleep(30000); 
} 
// Get resulting status... 

यह इस स्थिति में ठीक Thread.Sleep उपयोग करने के लिए है()? मुझे पता है कि यह आमतौर पर अच्छा अभ्यास नहीं है, लेकिन इसका उपयोग न करने के कारणों को पढ़ने से यह स्वीकार्य उपयोग की तरह लगता है।

धन्यवाद।

+1

'थ्रेड स्लीप' का उपयोग पूरी तरह स्वीकार्य है –

+4

कंसोल एप्लिकेशन निर्धारित किया जाएगा ? अगर ऐसा होता है तो क्यों न केवल हर 30 मिनट के लिए इसे शेड्यूल करें? बेहतर समाधान एक विंडोज सेवा होगी जो विधि को कॉल करने के लिए टाइमर का उपयोग करेगी। – Ray

+0

क्यों नहीं? इसका उपयोग न करने के कारण क्या हैं? –

उत्तर

6

Thread.Sleep यह सुनिश्चित करता है कि वर्तमान थ्रेड कम से कम निर्दिष्ट मिलीसेकंड पास हो गया है। ऐसा करने के लिए बहुत सारे स्थान उचित हैं, और आपका उदाहरण ठीक लगता है, यह मानते हुए कि यह पृष्ठभूमि थ्रेड पर चल रहा है।

कुछ उदाहरण देता है आप इसका इस्तेमाल नहीं करना चाहते हैं - यूआई धागे या जहाँ आप सही समय क्या करने की जरूरत पर।

+3

मुझे लगता है कि आपकी योग्यता "यह मानती है कि यह पृष्ठभूमि थ्रेड पर चल रहा है" ठीक है, लेकिन इस मामले में एप्लिकेशन एक कंसोल एप्लिकेशन प्रतीत होता है जो एक निर्धारित कार्य के रूप में स्वचालित रूप से चलाया जाएगा, इसलिए मुझे लगता है कि इस मामले में यह आवश्यक नहीं है सुनिश्चित करें कि यह पृष्ठभूमि धागे पर चलता है। यदि यह एक इंटरैक्टिव एप्लिकेशन था, तो मैं आपकी योग्यता से पूरी तरह सहमत हूं। –

+0

मेरा मतलब पृष्ठभूमि में चल रहे किसी भी थ्रेड द्वारा पृष्ठभूमि धागा है, यानी यूआई थ्रेड नहीं। सेवा धागे मैं पृष्ठभूमि धागे पर विचार करेंगे। (मैं थ्रेड ऑब्जेक्ट्स पर 'इसाबैकग्राउंड' का जिक्र नहीं कर रहा हूं, जो कि केवल ऐप निकास, आईआईआरसी पर धागे को नष्ट/साफ करने के तरीके को संदर्भित करता है)। ओह, आपको कंसोल नहीं देखा था। हाँ, यह बहस योग्य शब्दावली है, लेकिन यह वास्तव में एक पृष्ठभूमि धागा नहीं है, बिल्कुल सही है। मैं तब तर्क दे सकता हूं कि एक कंसोल ऐप इतना उपयुक्त नहीं है .. –

+1

आह, मुझे आपका मतलब है। :) मैं अर्थशास्त्र पर बहस करने का इरादा नहीं रख रहा था, लेकिन आपकी टिप्पणी ने मुझे एहसास दिलाया है कि इस मामले में, कंसोल एप्लिकेशन के "मुख्य धागे" को "पृष्ठभूमि" थ्रेड के रूप में माना जा सकता है क्योंकि कोई उपयोगकर्ता इंटरैक्शन नहीं है। –

3

नींद() के खिलाफ सामान्य आपत्ति यह है कि यह एक थ्रेड बर्बाद कर देता है।

आपके मामले में केवल 1 थ्रेड (शायद 2) है ताकि वास्तव में एक समस्या नहीं है।

तो मैं यह ठीक लग रहा है लगता है (लेकिन मैं 29 सेकंड सोने को कुछ ढीला में कटौती करने के होगा)।

+0

मुझे 2 9 सेकेंड चीज़ के बारे में आश्वस्त नहीं है .. अमेज़ॅन को कुछ एपीआई कॉल के बीच 60 सेकंड की आवश्यकता है। 'थ्रेड। स्लीप (60 * 1000)' अभी भी दुर्लभ मामलों में 60 सेकेंड देरी के बारे में बात करने में त्रुटि देता है और इसलिए * उस * विशिष्ट मामले में मैं 62 सेकेंड के लिए सोता हूं, यानी इसे * अधिक * ढीला दें। वाईएमएमवी और वह सब .. –

1

यह ठीक है, सिवाय इसके कि आप इसमें बाधा नहीं कर सकते हैं एक बार यह धागा (जो अनुशंसित नहीं है) निरस्त किया जा रहा बिना, नींद में चला जाता है।

क्यों एक ManualResetEvent एक बेहतर विचार हो सकता है, क्योंकि यह एक अलग धागे से संकेत किया जा सकता है ("जागृत") है कि।

1

आप थ्रेड के साथ रह सकते हैं। स्लीप विधि। लेकिन यह हर 30 मिनट चलाने के लिए शेड्यूल करने के लिए और अधिक सुरुचिपूर्ण होगा - इसलिए आपको अपने आवेदन के अंदर प्रतीक्षा का ख्याल रखना नहीं है।

5

आम तौर पर, Thread.Sleep किसी भी अन्य उपकरण की तरह है: पूरी तरह से उपयोग करने के लिए ठीक है, सिवाय इसके कि जब इसका बहुत दुरुपयोग किया जाता है। मैं "आमतौर पर अच्छा अभ्यास नहीं" भाग से असहमत हूं, जो Thread.Sleep का दुरुपयोग करने वाले लोगों का परिणाम है जब उन्हें कुछ और करना चाहिए (यानी सिंक्रनाइज़ेशन ऑब्जेक्ट पर अवरुद्ध होना)।

आपके मामले में प्रोग्राम एकल-थ्रेडेड है, इसमें कोई यूआई नहीं है (यानी थ्रेड में कोई संदेश लूप नहीं है) और आप बाहरी घटनाओं के साथ सिंक्रनाइज़ नहीं करना चाहते हैं। इसलिए Thread.Sleep बस ठीक है।

0

थ्रेड। समय आवधिक तर्क निष्पादित करने के लिए सबसे अच्छा नहीं है। थ्रेड। नींद (एन) का मतलब है कि आपका धागा एन मिलीसेकंड के लिए नियंत्रण छोड़ देगा। इस बात की कोई गारंटी नहीं है कि एन मिलीसेकंड के बाद यह नियंत्रण प्राप्त करेगा, यह सीपीयू लोड पर निर्भर करता है।

0

यदि आप 30 मिनट के लिए थ्रेड लॉक कर रहे हैं तो आपको हर 30 मिनट में विंडोज़ कार्य निर्धारित करना चाहिए, इसलिए प्रोग्राम निष्पादित होता है और फिर समाप्त होता है। इस तरह आप इतने लंबे समय तक धागे को लॉक नहीं कर रहे हैं।

कम समय के लिए, जैसे 30 सेकंड/1 मिनट, सिस्टम। थ्रेड। नींद() पूरी तरह से ठीक है। 5 मिनट से अधिक के लिए मैं एक विंडोज़ कार्य का उपयोग करता हूं। (आईएम स्पैनिश मुझे लगता है कि अंग्रेजी संस्करण पर मुझे कॉल किया गया है, जो आप नियंत्रण कक्ष से शेड्यूल किए गए कार्यों के बारे में बात कर रहे हैं ;-))

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