2012-03-05 23 views
9

मैं समझता हूं कि एक विंडोज सेवा में, Thread.Sleep(timeout) के बजाय Timer का उपयोग करना बेहतर है। हालांकि, सभी कोड उदाहरणों में मैं इंटरनेट पर पा सकता हूं जो Azure श्रमिकों को संभालने में सक्षम था, यह Thread.Sleep(timeout) है जिसका उपयोग Timer के बजाय किया जाता है।.NET में Azure कार्यकर्ता भूमिका में थ्रेड स्लीप या टाइमर का उपयोग करना?

यहां तक ​​कि डिफ़ॉल्ट दृश्य स्टूडियो में कार्यकर्ता परियोजना टेम्पलेट में प्रदान किए गए कोड का उपयोग करता है एक Thread.Sleep:

public class WorkerRole : RoleEntryPoint 
{ 
    public override void Run() 
    { 
     // This is a sample worker implementation. Replace with your logic. 
     Trace.WriteLine("$projectname$ entry point called", "Information"); 

     while (true) 
     { 
      Thread.Sleep(10000); 
      Trace.WriteLine("Working", "Information"); 
     } 
    } 
// ... 
} 

अब तक, मैं भी Thread.Sleep मेरी कार्यकर्ताओं में, लेकिन वास्तव में क्यों समझे बिना उपयोग कर रहे हैं। तो मेरा सवाल है, के बजाय Azure कार्यकर्ता भूमिका में Thread.Sleep(timeout) का उपयोग क्यों करें? विंडोज सेवा और एज़ूर कार्यकर्ता के बीच क्या अंतर है जो इस अंतर को समझता है कि हमें इस तरह के आवेदन को कैसे समझना है? क्या Azure श्रमिकों में Timer का उपयोग करना अच्छा या बुरा है?

इस के मूलभूत सिद्धांतों को समझाते हुए कुछ संसाधनों के लिंक के साथ कोई स्पष्टीकरण स्वागत है क्योंकि मुझे अब तक कुछ भी नहीं मिला।

+0

यह वास्तव में विंडोज़ एज़ूर-विशिष्ट प्रश्न नहीं है। एक [शानदार स्टैक ओवरफ्लो उत्तर] है (http://stackoverflow.com/questions/2822441/system-timers-timer-threading-timer-vs-thread-with-whileloop-thread-sleep-for) जो काफी हद तक चला जाता है विभिन्न टाइमर के बारे में विस्तार से। यह विंडोज़ एज़ूर वीएम पर भी लागू होता है, क्योंकि वे विंडोज सर्वर 2008 वीएम हैं। –

+0

लिंक के लिए धन्यवाद। यह दिलचस्प है लेकिन मुझे ऐसा नहीं लगता कि यह वास्तव में मेरे प्रश्न का उत्तर देता है। मैं समझता हूं कि विंडोज़ एज़ूर वीएम भी है, लेकिन अगर यह _just_ वीएम था, तो क्यों न केवल विंडोज सेवाओं का उपयोग करना? इस मामले में, मेरे प्रश्न की आवश्यकता नहीं होगी। – Guillaume

+0

आह ... अच्छा, आप निश्चित रूप से विंडोज सेवाओं का उपयोग कर सकते हैं। हालांकि, विंडोज़ एज़ूर में विंडोज सेवा का उपयोग करने के लिए, आपको कुछ काम करने की आवश्यकता होगी। यहां एक [ब्लॉग पोस्ट] है (http://blogs.msdn.com/b/mwasham/archive/2011/03/30/migrating-a-windows-service-to-windows-azure.aspx) दिखा रहा है कि इसमें क्या शामिल है। Windows Azure वर्कर या वेब रोल द्वारा प्रदान की गई घटनाओं के भीतर अपना कोड चलाने के लिए यह अधिक सरल है। सर्वरफॉल्ट पर भी [इसके बारे में जवाब] (http://serverfault.com/a/365054/99269) देखें। –

उत्तर

15

Thread.Sleep() लूप का उद्देश्य Run() विधि से बाहर निकलने के लिए है। यदि Run() निकलता है, तो आपका कार्यकर्ता पुनरारंभ होगा। मुझे नहीं पता कि आप उस लक्ष्य को टाइमर के साथ प्रभावी ढंग से पूरा कर सकते हैं।

अधिकतर संभावना है कि आपका सीपीयू कुछ भी करने के लिए हर 1000 एमसीईसी को उस धागे को जागने के लिए कुछ समय बर्बाद कर रहा है। मुझे संदेह है कि यह महत्वपूर्ण है, लेकिन यह मुझे भी खराब कर दिया। मेरा समाधान इसके बजाय रद्दीकरण टोकन पर इंतजार करना था।

public class WorkerRole : RoleEntryPoint { 
    CancellationTokenSource cancelSource = new CancellationTokenSource(); 

    public override void Run() 
    { 
     //do stuff 
     cancelSource.Token.WaitHandle.WaitOne(); 
    } 

    public override void OnStop() 
    { 
     cancelSource.Cancel(); 
    } 
} 

यह व्यस्त प्रतीक्षा पर CPU समय बर्बाद किए बिना रन() विधि को बाहर निकलने से रोकता है। आप किसी अन्य शट डाउन ऑपरेशंस को शुरू करने के लिए अपने प्रोग्राम में कहीं और रद्द करने के लिए रद्द कर सकते हैं।

+0

आपका मतलब है कि मेरे पास एक टाइमर है जो मेरे 'वर्कररोल' वर्ग के स्थिर क्षेत्र के रूप में सेट किया गया है और इसकी 'समाप्त' घटना में एक विधि है, 'थ्रेड()' विधि संसाधित होने के बाद थ्रेड अभी भी बाहर निकल जाएगा ? – Guillaume

+1

हां, दस्तावेज कहता है। यदि आप इसे आजमाते हैं, तो आप शायद अपनी भूमिका को लगातार शुरू, बंद करें और पुनरारंभ करें देखेंगे। http://msdn.microsoft.com/en-us/library/windowsazure/microsoft.windowsazure.serviceruntime.roleentrypoint.run.aspx –

+2

'थ्रेड स्लीप (टाइमआउट.इफिनिटी)' समाधान कैसे इंतजार कर रहा है 'WaitHandle' पर? और उस मामले के लिए, क्यों न केवल 'मैनुअल रीसेट इवेंट' का उपयोग करें? यह एक ही चीज़ की संभावना से अधिक है। – casperOne

-2

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

तो Timer हमेशा किसी भी प्रकार के विराम के लिए उपयोग किया जाना चाहिए।

कोड उदाहरण आमतौर पर सादगी के लिए Thread.Sleep का उपयोग करते हैं।

+0

एम $ चार्ज कुछ भी नहीं करने के लिए? बहुत बढ़िया - काश मैं उससे दूर हो सकता है! –

+7

@ मार्टिन - संसाधनों के उपयोग के लिए माइक्रोसॉफ्ट शुल्क। आप अपना वीएम पूरे दिन 0% या 100% सीपीयू पर चला सकते हैं - आपका कॉल। आप प्रति कोर प्रति कोर भुगतान करते हैं। बस एक होटल के कमरे किराए पर लेने की तरह: आप भुगतान करते हैं कि आप इसमें पार्टी को फेंक रहे हैं या इसे दर्शनीय स्थलों से दूर रखते हैं। –

+0

वास्तव में, यह केवल कोड उदाहरण नहीं है जो मैंने पाया कि 'थ्रेड स्लीप' का उपयोग करें। जब भी आप एक नया वर्कर प्रोजेक्ट बनाते हैं तो वर्कर टेम्पलेट द्वारा प्रदान किया गया डिफ़ॉल्ट कोड भी 'थ्रेड स्लीप' का उपयोग करता है। – Guillaume

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