2012-10-11 15 views
6

में मैं समय-समय पर एक समारोह को चलाने के लिए चाहता हूं, इसलिए 10 सेकंड के बाद इसे 10 बार निष्पादित किया जाता है। सरल दृष्टिकोण इस तरह एक पाश उपयोग कर रहा है:नींद-सी #

while(true) 
{ 
Thread.Sleep(1000); 
function(); 
} 

लेकिन इस दृष्टिकोण के साथ मुख्य समस्या यह है कि यह किसी भी समय-समय पर गारंटी प्रदान नहीं करेगा। मेरा मतलब है कि फ़ंक्शन चलाने के लिए 0.1 सेकंड लगते हैं() फ़ंक्शन का निष्पादन समय इस तरह होगा: 0, 1.1, 2.2, 3.3, 4.4, ...

जैसा कि मुझे याद है, वास्तविक समय भाषा में एडीए हमारे पास एक समारोह नींद-तक (# समय) है। अब मैं सी # में एक विकल्प की तलाश में हूं।

कोई भी नमूना कोड पकड़ा जाएगा।

+2

छोटे इनवर्ल्स में सोएं और जांचें कि आपका कोड निष्पादित करने से पहले एक पूरा सेकंड बीत चुका है या नहीं। – VVS

+0

यदि आप निष्पादित करने के लिए फ़ंक्शन() को 1 सेकंड से अधिक समय लेते हैं तो आप क्या करना चाहते हैं? –

+0

सी # एक वास्तविक समय भाषा नहीं है। यह भी गारक्षित नहीं है धागा 1 सेकंड के बाद ठीक से निष्पादित होगा, क्योंकि अन्य धागे/प्रक्रियाएं हो सकती हैं। यदि आपको यह सटीक होना चाहिए, तो शायद आपको कुछ अन्य टूल का उपयोग करना चाहिए? – YavgenyP

उत्तर

4
System.Threading.Timer timer = new System.Threading.Timer(ThreadFunc, null, 0, 1000); 

private static void ThreadFunc(object state) 
{ 
    //Do work in here. 
} 

अधिक जानकारी के लिए MSDN देखें है।

+0

ग्रेट, यही वह है जिसे मैं ढूंढ रहा था। बहुत बहुत धन्यवाद – user1654052

+0

मदद करने के लिए खुशी हुई। उत्तर के रूप में चिह्नित करना याद रखें। –

+0

मैं 2 मिनट के बाद ऐसा करूँगा (आप 2 मिनट के बाद एक जवाब स्वीकार कर सकते हैं) – user1654052

1

विशिष्ट अंतराल के बाद कुछ करने के लिए आपको टाइमर क्लास का उपयोग करना चाहिए। यहाँ Tutorial

+0

बहुत बहुत धन्यवाद। वह वास्तव में उपयोगी था :) – user1654052

3

आप समय को मापने के लिए Stopwatch का उपयोग कर सकते हैं। मैं इसके बजाय For-Loop का भी उपयोग करूंगा।

var sw = new System.Diagnostics.Stopwatch(); 
var timeForOne = TimeSpan.FromSeconds(1); 
var count = 10; 
for(int i = 0; i < count; i++) 
{ 
    sw.Restart(); 
    function(); 
    sw.Stop(); 
    int rest = (timeForOne - sw.Elapsed).Milliseconds; 
    if (rest > 0) 
     System.Threading.Thread.Sleep(rest); 
} 
+0

ग्रेट, लेकिन मुझे अभी भी लगता है कि आखिरी अगर ब्लॉक है, तो बाकी की नींद और नींद समारोह कॉल की गणना कभी-कभी होती है और पिछले किसी के ऊपर कोई लाभ नहीं दिखता! ! यह एक विकल्प है लेकिन दूसरा आसान दिखता है :) – user1654052

+0

@ user1654052: असल में यह अनिवार्य है कि 'टाइमस्पैन' क्या है।घटाएं '+ 'अगर (बाकी> 0)' उपभोग करता है, यह पूरी तरह नगण्य और 1 मिलीसेकंड से कम है। –

+0

यह सिर्फ इतना नहीं है। सावधानी से देखो। [sw.stop; int आराम = blah; अगर (बाकी> 0)] सभी अपने समय और कार्य को ध्यान में रखे बिना निष्पादित किए गए :) मुझे पता है कि यह नगण्य दिखता है लेकिन यदि यह एक साल तक चलाया जा रहा है तो आप गारंटी नहीं दे सकते कि समारोह हर एक दूसरे को निष्पादित किया जाता है। यही कारण है कि मुझे नहीं लगता कि यह स्वीकार्य उत्तर – user1654052