2014-06-23 8 views
8

यह स्पष्ट है: उदाहरण के लिए, मेरे रूप में एक बटन की कल्पना करें। जब उपयोगकर्ता बटन पर क्लिक करता है, तो कुछ शून्य विधि 30 सेकंड के बाद चलनी चाहिए।विशिष्ट समय अंतराल के बाद कोई विधि कैसे चलाएं?

एक शून्य विधि "DoAfterDelay" होगी जो 2 इनपुट लेती है, पहला ऐसा करने का तरीका है (प्रतिनिधियों का उपयोग करके), और दूसरा समय अंतराल है। इसलिए मैं होगा:

public delegate void IVoidDelegate(); 
static void DoAfterDelay(IVoidDelegate TheMethod, TimeSpan Interval) 
    { 
     // *** Some code that will pause the process for "Interval". 
     TheMethod(); 
    } 

तो मैं सिर्फ एक विशिष्ट समय अंतराल के लिए प्रक्रिया को रोकने के लिए कोड का एक टुकड़ा की जरूरत है। पहले, मुझे लगता है कि ऐसा करने के लिए इस कोड का प्रयोग किया:

System.Threading.Thread.Sleep(Interval); 

लेकिन इस कोड मेरे लिए अच्छा नहीं है क्योंकि यह पूरी प्रक्रिया बंद हो जाता है और कार्यक्रम जमा है। मैं नहीं चाहता कि कार्यक्रम "DoAfterDelay" विधि में फंस जाए। यही कारण है कि Thread.Sleep बेकार है।

तो क्या कोई बेहतर तरीका सुझा सकता है? बेशक मैंने इसके बारे में खोज की है, लेकिन अधिकांश समाधान मैंने पाया है कि टाइमर का उपयोग करने के आधार पर (उदाहरण के लिए here)। लेकिन टाइमर का उपयोग करना मेरी आखिरी राय है, क्योंकि विधि को एक बार चलाना चाहिए और टाइमर का उपयोग करना प्रोग्राम को पढ़ने में भ्रमित कर देता है। तो अगर वहां है तो मैं एक बेहतर समाधान की तलाश में हूं। या शायद मुझे टाइमर का उपयोग करना होगा?

मुझे लगता है मुझे धागे के साथ खेलना है, लेकिन यकीन नहीं है। तो मुझे आश्चर्य है कि कोई मुझे समाधान के लिए मार्गदर्शन कर सकता है। अग्रिम में धन्यवाद।

+3

एक 'Timer' उपयोग करके देखें। – Adrian

उत्तर

7

क्या आप कोई कार्य का उपयोग कर सकते हैं?

Task.Factory.StartNew(() => 
    { 
     System.Threading.Thread.Sleep(Interval); 
     TheMethod(); 
    }); 
+0

उत्तर के लिए धन्यवाद। तो वास्तव में धागे के साथ खेल समाधान है। –

+2

@ मोस्तफाफारज़न यह बेहद अक्षम/अपर्याप्त है कि वहां कोई धागा बैठे हुए कुछ भी नहीं कर रहा है ताकि आप कुछ समय के बाद कुछ कोड निष्पादित कर सकें। – Servy

+0

यह एक परिदृश्य में था जब कोई उपयोगकर्ता एक बटन पर क्लिक करता है, इसलिए एक बड़ा ओवरहेड नहीं होता क्योंकि यह अक्सर होने वाला नहीं होता है। अन्यथा मैं एक कार्य शेड्यूलर लिखने का सुझाव देना चाहूंगा। –

0

DoAfterDelay एक टाइमर है कि सिर्फ एक बार है कि जब यह समाप्त हो रहा है यह आपके शून्य 'TheMethod'function कॉल चलाता है, शुरू होता है। यह गन्दा क्यों होगा?

0

यहाँ तुम क्या चाहते हो:

public static void Example1c() 
    { 
     Action action = DoSomethingCool; 
     TimeSpan span = new TimeSpan(0, 0, 0, 5); 

     ThreadStart start = delegate { RunAfterTimespan(action, span); }; 
     Thread t4 = new Thread(start); 
     t4.Start(); 

     MessageBox.Show("Thread has been launched"); 
    } 
    public static void RunAfterTimespan(Action action, TimeSpan span) 
    { 
     Thread.Sleep(span); 
     action(); 
    } 
    private static void DoSomethingCool() 
    { 
     MessageBox.Show("I'm doing something cool"); 
    } 

कार्रवाई का उपयोग करने का लाभ यह है कि यह आसानी से मानकों में पारित करने के लिए संशोधित किया जा सकता है। मान लें कि आप DoSomethingCool को एक पूर्णांक पास करने में सक्षम होना चाहते हैं। बस thusly संशोधित:

public static void Example1c() 
    { 
     Action<int> action = DoSomethingCool; 
     TimeSpan span = new TimeSpan(0, 0, 0, 5); 
     int number = 10; 

     ThreadStart start = delegate { RunAfterTimespan(action, span, number); }; 
     Thread t4 = new Thread(start); 
     t4.Start(); 

     MessageBox.Show("Thread has been launched"); 
    } 
    public static void RunAfterTimespan(Action<int> action, TimeSpan span, int number) 
    { 
     Thread.Sleep(span); 
     action(number); 
    } 
    private static void DoSomethingCool(int number) 
    { 
     MessageBox.Show("I'm doing something cool"); 
    } 

बहुत लचीला ...

11

यह है जहाँ आप async उपयोग कर सकते हैं नेट 4.5

की कार्यक्षमता आप Task.Delay उपयोग कर सकते हैं एक मिलीसेकंड में देरी देने का इंतजार । यह एक बहुत ही साफ तरीका है। पूर्व:

private async void button1_Click(object sender, EventArgs e) 
    { 
     await Task.Delay(5000); 

     TheMethod(); 
    } 
0

धागे बनाने के कई तरीके हैं लेकिन निश्चित रूप से, यह आपके द्वारा किए जा रहे कार्यों पर निर्भर करता है। आप इस तरह मक्खी पर एक धागा बना सकते हैं:

Thread aNewThread = new Thread(
    () => OnGoingFunction() 
); 
aNewThread.Start(); 

यह धागा पृष्ठभूमि में चल रहा हो जाएगा। जिस कार्य को आप करना चाहते हैं, उसकी नींद की प्रक्रिया होने पर सोने की नींद की विधि होनी चाहिए। तो इस तरह कुछ:

private void OnGoingFunction() 
{ 
    //Code.... 
    Thread.Sleep(100); //100 ms, this is in the thead so it will not stop your winForm 
    //More code.... 
} 

मुझे उम्मीद है कि इससे मदद मिलती है।

एक और विकल्प धागा बनाना है जब भी आपको इसे संसाधित करने की आवश्यकता होती है और नींद विकल्प के बारे में चिंता न करें। बस एक नया धागा हर बार प्रक्रिया

0

लोड करने के लिए बनाते हैं तो आप एक Coroutine

public IEnumerator waitAndRun() 
{ 
    // WAIT FOR 3 SEC 
    yield return new WaitForSeconds(3); 
    // RUN YOUR CODE HERE ... 
} 

बना सकते हैं और से कॉल करने चाहिए:

StartCoroutine(waitAndRun()); 
संबंधित मुद्दे