दिलचस्प पोस्ट
क्लासिक एएसपी एसक्यूएल इंजेक्शन प्रोटेक्शन अभिव्यक्ति भाषा में जावास्क्रिप्ट भागो दोहराएँ स्ट्रिंग – जावास्क्रिप्ट सी + + (यूनिकोड) में एलटीपी :: स्ट्रिंग को एलपीसीडब्लूआर में कैसे परिवर्तित करें साधारण PHP SQL लॉगिन समस्या निवारण मैं LINQ का उपयोग कर किसी सरणी में सर्वोच्च मूल्य का सूचकांक कैसे प्राप्त करूं? बावर्ची व्यंजनों में समय बनाम चलाने का समय संकलित करें स्थानीय HTML फ़ाइल को सी # वेबब्राउजर में लोड करें एक एमपी 4 वीडियो आउटपुट करने के लिए php का उपयोग करना ब्लूटूथ डिवाइस को प्रोग्रामेटिक एंड्रॉइड से कैसे जोड़ा जाए asp.net mvc सजाने के लिए कई enums के साथ क्यों जावा की तारीख .getYear () 2011 के बजाय 111 की वापसी करता है? AngularJS – नियंत्रक में दिनांक परिवर्तित करें howto बेंचमार्क जावास्क्रिप्ट कोड? जाँच अपवादों के खिलाफ मामला

थ्रेड के उपयोग की तुलना करें। विलम्बित निष्पादन के लिए स्लीप और टाइमर

मेरे पास एक ऐसा तरीका है जो निर्दिष्ट समय के लिए चलने में देरी होनी चाहिए।

क्या मुझे इसका उपयोग करना चाहिए

Thread thread = new Thread(() => { Thread.Sleep(millisecond); action(); }); thread.IsBackground = true; thread.Start(); 

या

 Timer timer = new Timer(o => action(), null, millisecond, -1); 

मैंने थ्रेड का उपयोग करने के बारे में कुछ लेख पढ़ा था। नींद खराब डिजाइन है लेकिन मुझे वाकई क्यों नहीं समझ में आ रहा है

लेकिन टाइमर का उपयोग करने के लिए, टाइमर ने विधि का निपटान किया है। चूंकि निष्पादन में देरी हो रही है, मुझे पता नहीं है कि टाइमर कैसे निपटाना है। क्या तुम्हारे पास कोई सुझाव है?

या यदि आपके पास विलंबित निष्पादन के लिए वैकल्पिक कोड हैं तो भी सराहना करते हैं।

धन्यवाद,

वेब के समाधान से एकत्रित समाधान "थ्रेड के उपयोग की तुलना करें। विलम्बित निष्पादन के लिए स्लीप और टाइमर"

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

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

टाइमर को नष्ट करने के लिए, कॉलबैक एक पैरामीटर स्वीकार कर सकता है, इसलिए आप टाइमर को पैरामीटर के रूप में ही पास कर सकते हैं और कॉलबैक में विवाद कर सकते हैं (हालांकि मैंने इसे करने की कोशिश नहीं की है – मुझे लगता है कि टाइमर कॉलबैक के दौरान बंद हो सकता है)।

संपादित करें: नहीं, मुझे लगता है आप ऐसा नहीं कर सकते, क्योंकि आपको टाइमर निर्माता में कॉलबैक पैरामीटर को निर्दिष्ट करना होगा।

शायद ऐसा कुछ है? (फिर से, वास्तव में यह कोशिश नहीं की है)

 class TimerState { public Timer Timer; } 

… और टाइमर शुरू करने के लिए:

 TimerState state = new TimerState(); lock (state) { state.Timer = new Timer((callbackState) => { action(); lock (callbackState) { callbackState.Timer.Dispose(); } }, state, millisecond, -1); } 

लॉकिंग को टाइमर कॉलबैक को टाईमर फ़ील्ड सेट करने से पहले टाईमर को खाली करने की कोशिश करने से रोकना चाहिए।


परिशिष्ट: जैसा कि टिप्पणीकार ने बताया है, यदि क्रिया () UI के साथ कुछ करता है, तो एक सिस्टम का उपयोग कर.विंडो.फ़ॉर्म। टाइमर शायद एक बेहतर शर्त है, क्योंकि यह UI थ्रेड पर कॉलबैक चलाएगा। हालांकि, अगर यह मामला नहीं है, और यह थ्रेड के नीचे है। सो बनाम थ्रेडिंग। टाइमर, थ्रेडिंग। मीमर जाने का रास्ता है।

टाइमर के बजाय ThreadPool.RegisterWaitForSingleObject उपयोग करें:

 //Wait 5 seconds then print out to console. //You can replace AutoResetEvent with a Semaphore or EventWaitHandle if you want to execute the command on those events and/or the timeout System.Threading.ThreadPool.RegisterWaitForSingleObject(new AutoResetEvent(false), (state, bTimeout) => Console.WriteLine(state), "This is my state variable", TimeSpan.FromSeconds(5), true); 

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

उदाहरण के लिए, मैं एक पॉप 3 क्लाइंट पर काम कर रहा था जहां प्रोग्रामर थ्रेड का उपयोग कर रहा था। नींद (1000) सॉकेट पुनर्प्राप्त मेल की प्रतीक्षा करने के लिए उस स्थिति में सॉकेट के पूरा होने के बाद गर्तिका में एक ईवेंट हैंडलर को हुक करने और सतत प्रोग्राम निष्पादन को बेहतर करना बेहतर था।

मुझे याद है कि एरिक के एक के समान एक समाधान को लागू करना। यह एक काम कर रहा है;)

 class OneTimer { // Created by Roy Feintuch 2009 // Basically we wrap a timer object in order to send itself as a context in order to dispose it after the cb invocation finished. This solves the problem of timer being GCed because going out of context public static void DoOneTime(ThreadStart cb, TimeSpan dueTime) { var td = new TimerDisposer(); var timer = new Timer(myTdToKill => { try { cb(); } catch (Exception ex) { Trace.WriteLine(string.Format("[DoOneTime] Error occured while invoking delegate. {0}", ex), "[OneTimer]"); } finally { ((TimerDisposer)myTdToKill).InternalTimer.Dispose(); } }, td, dueTime, TimeSpan.FromMilliseconds(-1)); td.InternalTimer = timer; } } class TimerDisposer { public Timer InternalTimer { get; set; } } 

मेरे पास सिस्टम के साथ एकमात्र बीफ़ है। टिमर यह है कि ज्यादातर समय मैंने देखा है कि मतदान सेवाओं और डेवलपर्स में लंबे समय से देरी (घंटों, मिनट) के लिए इसका उपयोग किया जाता है, वे टाइमर शुरू करने से पहले इस घटना को लॉन्च करने के लिए अक्सर भूल जाते हैं। इसका मतलब यह है कि अगर मैं ऐप या सेवा शुरू करता हूँ, तो मुझे वास्तव में कार्यान्वित करने से पहले टाइमर समाप्त होने तक (घंटों, मिनट) तक इंतजार करना पड़ता है।

बेशक, यह टाइमर के साथ कोई समस्या नहीं है, लेकिन मुझे लगता है कि इसकी अक्सर अनुचित तरीके से प्रयोग किया जाता है क्योंकि इसका दुरुपयोग करना बहुत आसान है

@ मिन्कोलोकॉप थ्रेडपूल का उपयोग नहीं करते हैं.रजिस्टरवाइटफोरसिगलेऑब्जेक्ट टाइमर के बजाय, सिस्टम। थ्रेडिंग। टाइमर एक कॉलबैक को एक थ्रेड पूल थ्रेड पर निष्पादित करने के लिए कतार देगा जब समय बीत गया है और प्रतीक्षा संचालन की आवश्यकता नहीं है, एकल ऑब्जेक्ट की प्रतीक्षा करें एक थ्रेडपूल थ्रेड को टाई करने के लिए इवेंट को इंगित किया जा सकता है या थ्रेड कॉलबैक कॉल करने से पहले समाप्त होने का समय समाप्त होता है।