2010-11-22 17 views
7

मैं अपने सॉफ्टवेयर में समय को मापने और बताने के लिए अगर "कार्रवाई एक" के बाद "कार्रवाई ख"सिस्टम का समय बदल गया है या नहीं, मैं कैसे पता लगा सकता हूं? (.net से)

हालांकि क्या हुआ अगर कम 10 सेकंड से अधिक होता है में सक्षम होना चाहिए करने के लिए DateTime.UtcNow उपयोग कर रहा हूँ सिस्टम समय बदल गया है? तो मैं कैसे पता लगा सकता हूं कि सिस्टम का समय बदल गया है या नहीं?

मैं एक स्टॉपवॉच का उपयोग करने के रूप में हम एक से अधिक CPU के साथ सर्वर पर चलाने की आवश्यकता नहीं करना चाहते, मैं भी आभासी मशीनों को रोक दिया और पुन: प्रारंभ किया जा रहा से निपटने के लिए की जरूरत है http://kristofverbiest.blogspot.com/2008/10/beware-of-stopwatch.html

देखते हैं, तो "टिक गिनती "मेरे लिए उपयोगी होने की संभावना नहीं है।

+0

यह सुनिश्चित नहीं है कि समझ में आता है, टाइमस्पेन घड़ी में बदलाव से प्रभावित नहीं होता है।डेलाइट सेविंग टाइम और टाइम ज़ोन परिवर्तन कैश किए जाते हैं, वे UtcNow को प्रभावित नहीं करते हैं। –

उत्तर

8

आप समय बदलने का पता लगाने के लिए SystemEvents.TimeChanged ईवेंट का उपयोग कर सकते हैं। हालांकि, यह केवल तभी आग लगेगा जब आपके पास मैसेजपंप चल रहा हो - यह विंडोज क्लाइंट अनुप्रयोगों के लिए ठीक है, लेकिन अधिकांश सर्वर अनुप्रयोगों (जैसे सेवाएं, वेब ऐप्स इत्यादि) के लिए बहुत कुछ नहीं है।

अन्यथा आप Environment.TickCount का उपयोग कर सकते हैं - इसमें उत्कृष्ट रिज़ॉल्यूशन नहीं है, लेकिन यदि आपका "10" सेकंड "लगभग 10 सेकंड" हो सकता है तो आप शायद ठीक हैं। वीएम सीमा के रूप में, ध्यान दें कि मशीन काफी लंबे समय तक चलने पर टिककंट रोल हो जाती है, इसलिए आपको इसे संभवतः DateTime.UtcNow सैनिटी चेक के साथ संभालना होगा।

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

1

आप रनटाइम पर सिस्टम घड़ी के अनुसार परिवर्तन का पता लगाने के लिए SystemEvents वर्ग के TimeChanged घटना का उपयोग कर सकते हैं:

http://msdn.microsoft.com/en-us/library/microsoft.win32.systemevents.timechanged.aspx

यह आपके एप्लिकेशन संदेश पाश होने पर निर्भर करता (मुझे लगता है क्योंकि WM_TIMECHANGED संदेश की जरूरत है संसाधित होने के लिए) तो यदि आपको एक हेडलेस एप्लिकेशन है तो आपको एक छिपे हुए फॉर्म की आवश्यकता होगी विंडोज़ सेवा

सिस्टम घड़ी में परिवर्तन का पता लगाने के लिए, जबकि निलंबित वर्चुअल मशीन पर होने के कारण आपका आवेदन निलंबित कर दिया गया है - अच्छी तरह से सभी शर्त वास्तव में विश्वसनीय समाधान के लिए बंद हैं। पिछली बार जब आपने चेक किया था, तो आप समय-समय पर रिकॉर्ड कर सकते थे, और बस यह सुनिश्चित कर लें कि समय पीछे नहीं चला है। वैसे भी एक वीएम को निलंबित और फिर से शुरू करने में दस सेकंड से अधिक समय लग सकता है।

4

मैं अब भी StopWatch का उपयोग करने का सुझाव दूंगा। यदि Beware of QueryPerformanceCounter में वर्णित समस्या अभी भी मौजूद है, तो आप केवल कुछ मिलीसेकंड का अंतर बोल रहे हैं। यदि आप नकारात्मक समय के बारे में चिंतित हैं (कुछ मैंने कभी नहीं देखा है, और मैं StopWatch का उपयोग कुछ सुंदर छोटे अंतराल के लिए बहुत समय तक करता हूं), फिर -1 मिलीसेकंड और -1,000 मिलीसेकंड के बीच शून्य के रूप में कुछ भी व्यवहार करें।

DateTime.Now या DateTime.UtcNow का उपयोग किसी भी प्रकार के समय के लिए आपको मशीन पर दिनांक/समय बदलने में परेशानी का कारण बनने जा रहा है। आपको कुछ ऐसा उपयोग करना है जो पूरी तरह से कंप्यूटर के लिए आंतरिक है और इसे बदला नहीं जा सकता है। StopWatch मुझे मिला सबसे विश्वसनीय है।

0

मैं 2 बार अंतराल के बीच एक मोनोटिक घड़ी के साथ सिस्टम समय अंतर की तुलना करूंगा। यदि किसी व्यक्ति की तुलना में अंतर कुछ टोलरेंस से बड़ा है, तो आपकी मशीन

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

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