2009-08-24 11 views
6

मैं 15 सेकंड के लिए इंतजार करना चाहता हूं, तो नियंत्रण अगले कथन से फिर से शुरू होना चाहिए।सी # में एक निश्चित समय (10 सेकंड कहें) का इंतजार करने का सबसे अच्छा तरीका क्या है?

मेरे पास प्रतीक्षा करते समय करने के लिए और कुछ नहीं है (बस प्रतीक्षा करें)।

मुझे पता है कि Thread.Sleep(15000) है। मुझे क्या पता नहीं है इंतजार करने का सबसे अच्छा तरीका है? इसकी सीमाएं क्या हैं?

कोड इस तरह होगा:

Method() 
{ 
    statement 1; 
    statement 2; 
    //WaitFor 15 secs here; 
    statement 3; 
} 
+0

Thread.Sleep (15000) सी # के लिए ठीक है। WinForms, WPF या ASP.NET के लिए यह एक आपदा है। –

+0

पास-डुप्लीकेट: http://stackoverflow.com/questions/1091710, http://stackoverflow.com/questions/407130, http://stackoverflow.com/questions/1208103 और http://stackoverflow.com/questions/903,688। –

उत्तर

2

कोशिश कुछ:

void Method() 
{ 
    console.log('statement 1'); 
    console.log('statement 2'); 

    var timer = new System.Threading.Timer(
     o => // timer callback 
     { 
      console.log('statement 2'); 
     }, 
     15000, // Delay 
     0  // Repeat-interval; 0 for no repeat 
    ); 
} 

सिंटेक्स सी # 3.0, प्रभावी ढंग से बयान 3 # के चारों ओर एक बंद बनाने के लिए एक लैम्ब्डा अभिव्यक्ति का उपयोग करता है। इसके साथ, आप विधि के किसी भी स्थानीय चर का उपयोग कर सकते हैं। हालांकि, ध्यान देने योग्य बात यह है कि इस विधि या किसी अन्य टाइमर-आधारित विधि के साथ ... टाइमर बनाने के तुरंत बाद फ़ंक्शन वापस आ जाएगा। टाइमर निष्पादित होने तक फ़ंक्शन ब्लॉक नहीं होगा।इसे प्राप्त करने के लिए, केवल एक चीज जिसे मैं सोच सकता हूं वह है कि वास्तव में धागे का उपयोग करें और सिग्नल (यानी वेटहैंडल, रीसेट इवेंट इत्यादि) पर विधि() ब्लॉक करें, जब तक कि अन्य थ्रेड पर समयबद्ध कॉल पूरा न हो जाए।

+4

इस उदाहरण के साथ एक समस्या है। यह विश्वसनीय रूप से काम नहीं करेगा, क्योंकि 'टाइमर' ऑब्जेक्ट का कोई संदर्भ कहीं भी नहीं रखा जाता है। इस प्रकार, यह कचरा संग्रह के अधीन है। आपकी देरी जितनी अधिक होगी, उतनी अधिक संभावना यह एक समस्या होगी। एमएसडीएन से: * जब तक आप टाइमर का उपयोग कर रहे हों, आपको इसका संदर्भ रखना होगा। किसी भी प्रबंधित वस्तु के साथ, टाइमर कचरा संग्रह के अधीन होता है जब इसका कोई संदर्भ नहीं होता है। तथ्य यह है कि एक टाइमर अभी भी सक्रिय है इसे एकत्रित होने से नहीं रोकता है। * – Thorarin

+0

@ थोरिनिन: आह, अच्छा बिंदु। मैं उस छोटे तथ्य के बारे में सब भूल गया। मैं देखूंगा कि मैं उदाहरण को सही कर सकता हूं या नहीं। – jrista

+0

यदि आप यूआई थ्रेड पर वापस कॉल भेजना चाहते हैं, तो आपको इसके बजाय 'System.Windows.Forms.Timer' का उपयोग करना चाहिए। –

1

तुम हमेशा एक टाइमर इस्तेमाल कर सकते हैं और उसके बाद निर्धारित अवधि के बाद कोड निष्पादित। हालांकि, अगर आपको वास्तव में कुछ भी नहीं करना है और बस कोड में किसी विशेष बिंदु पर इंतजार करना है, तो मुझे लगता है कि थ्रेड। स्लीप (150000); काफी है। [संपादित करें: वर्तनी]

2

थ्रेड.sleep प्रतीक्षा करने के दौरान कुछ और करने के लिए कुछ समझदार नहीं लगता है। यह थ्रेड को उस समय सोने के लिए रखता है ताकि यह किसी भी CPU संसाधनों का उपयोग न करे।

+0

हां, कोई अन्य तरीका सीपीयू का उपयोग करेगा, और आप नहीं चाहते हैं कि अगर आपको बस इतना करना है तो प्रतीक्षा करें ... – awe

+0

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

11

थ्रेड का नुकसान। नींद यह है कि अगर इसे आपके जीयूआई थ्रेड में कहा जाता है (थ्रेड जो जीयूआई घटनाओं को संसाधित करता है, उदाहरण के लिए, बटन बटन हैंडलर विधि पर क्लिक करता है, या एक बटन क्लिक हैंडलर इत्यादि से बुलाया जाता है) तो फिर आप आवेदन 15 दिनों के लिए फ्रीज और गैर जिम्मेदार होने के लिए दिखाई देंगे।

यह बिल्कुल ठीक हो सकता है अगर आप explicetly एक अलग धागा बनाया था और उस में Thread.Sleep कहा जाता है, यह सोचते हैं आपको लगता है कि धागा कोई आपत्ति नहीं है 15 सेकंड के लिए कुछ नहीं कर रहा।

विकल्प टाइमर बनाने और टाइम्स के लिए इसे शुरू करने के लिए विकल्प होगा, और टाइमर के लिए टिक ईवेंट हैंडलर में stmt 3 रखें, और उस हैंडलर में टाइमर को भी रोकें।

6

यह आपके प्रश्न का सीधा जवाब नहीं हो सकता है। मैं जाँच करें कि क्या आपके प्रक्रिया प्रवाह देखना हो कोड बेहतर ;-)

तुम सिर्फ यकीन है कि stmt2 बनाने के लिए 15 सेकंड के लिए इंतजार कर रहे हैं है की तुलना में बेहतर है कहेंगे; पूरा है? तो फिर एक हैंडलर जोड़ रहे हैं, जैसे ही stmnt 2 निष्पादित किया जाता है, एक बेहतर समाधान हो जाएगा (?)

तुम भी प्रतीक्षा करने के लिए एक टाइमर का उपयोग कर सकते हैं। Thread.sleep एक खराब डिजाइन है। हमारे पास एक समान प्रश्न है जो comparison using Thread.sleep and Timer के बारे में बात करता है।

0

आप हमेशा एक निश्चित समय के लिए इंतजार करना चाहते हैं, तो Sleep उपयोगी है। जाहिर है आपको ऐसा धागे पर नहीं करना चाहिए जहां समय पर प्रतिक्रिया की उम्मीद है।

ध्यान रखें कि आपका धागा सभी मामलों में अवधि के लिए सो जाएगा। अगर किसी कारण से आप धागे को जल्द से जल्द फिर से शुरू करना चाहते हैं, तो आप सिग्नलिंग या कॉलबैक का उपयोग करके बेहतर हो जाते हैं। Sleep के बजाय इनमें से किसी एक का उपयोग करके, आप अनावश्यक प्रतीक्षा समय को कम कर देंगे। निम्नलिखित की तरह

-1

मुझे यकीन है कि 100% नहीं है, लेकिन अगर आप वास्तव में अपने विधि की जरूरत है 15 सेकंड प्रतीक्षा करने के बाद वापस जाने के लिए, निम्न प्रयास करें:

 

Method() 
{ 
    stmt1(); 
    stmt2(); 

    int time = DateTime.Now.Millisecond; 
    while (15*1000 > DateTime.Now.Millisecond - time) 
    { 
     Thread.Sleep(10) 
     Application.DoEvents(); 
    } 
    stmt3(); 
} 
 
0
void Method() 
{ 
    Statement1(); 
    Statement2(); 

    // Start the timer for a single 15 second shot. 
    // Keep a reference to it (Mytimer) so that the timer doesn't get collected as garbage 
    Mytimer = new System.Threading.Timer((a) => 
     { 
      // Invoke the 3rd statement on the GUI thread 
      BeginInvoke(new Action(()=>{ Statement3(); })); 
     }, 
    null, 
    15000, // 15 seconds 
    System.Threading.Timeout.Infinite); // No repeat 
} 
संबंधित मुद्दे

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