2017-02-14 14 views
7

मैं प्रत्येक सेकंड पर कुछ कोड निष्पादित करना चाहता हूं। मैं जिस कोड का उपयोग कर रहा हूं वह है:क्या मैं टाइमर के रूप में कार्य। डेले का उपयोग कर सकता हूं?

कार्य.रुन ((क्रिया) निष्पादन कुछ); इस विधि एक धागा ब्लॉक करता है

private void ExecuteSomething() 
     { 
      Task.Delay(1000).ContinueWith(
       t => 
       { 
        //Do something. 

        ExecuteSomething(); 
       }); 
     } 

:

और ExecuteSomething() नीचे के रूप में परिभाषित किया गया है? या मुझे सी # में Timer कक्षा का उपयोग करना चाहिए? और यह Timer also dedicates a separate thread for execution लगता है (?)

+1

"अलग धागा" के संबंध में, केवल एक धागा है जो सभी टाइमर के बीच साझा किया जाता है। –

उत्तर

5

माइक्रोसॉफ्ट के रिएक्टिव फ्रेमवर्क इस लिए आदर्श है। बिट्स प्राप्त करने के लिए बस NuGet "System.Reactive"। तो फिर तुम यह कर सकते हैं:

IDisposable subscription = 
    Observable 
     .Interval(TimeSpan.FromSeconds(1.0)) 
     .Subscribe(x => execute()); 

आप सदस्यता बंद करना चाहते हैं, तो बस subscription.Dispose() कहते हैं। इसके शीर्ष पर प्रतिक्रियाशील फ्रेमवर्क कार्य या मूल टाइमर की तुलना में कहीं अधिक शक्ति प्रदान कर सकता है।

+1

क्या मेरे मामले में आरएक्स का उपयोग कार्य का उपयोग करने से कोई विशिष्ट फायदे है। डेले? सिर्फ यह जानना है कि इस उद्देश्य के लिए पैकेज को शामिल करना उचित है। वैसे भी ऊपर उठाया। – Sharun

+0

@ शारुन - आरएक्स में LINQ और फिर कुछ के रूप में ज्यादा शक्ति है। आपने जो वर्णन किया है उससे आपको और कुछ भी चाहिए, लेकिन मुझे संदेह है कि आपको वास्तव में आरएक्स ऑफ़र से क्या फायदा होगा। क्या आप जो कुछ करने की कोशिश कर रहे हैं उसके बारे में अधिक जानकारी दे सकते हैं? – Enigmativity

9

Task.DelayTimer का उपयोग करता है आंतरिक

Task.Delay के साथ आप Timer साथ तो एक छोटे से बोली लगाने के स्पष्ट अपने कोड बना सकते हैं। और async-await का उपयोग मौजूदा थ्रेड (आमतौर पर यूआई) को अवरुद्ध नहीं करेगा।

public async Task ExecuteEverySecond(Action execute) 
{ 
    while(true) 
    { 
     execute(); 
     await Task.Delay(1000); 
    } 
} 

स्रोत कोड से: Task.Delay

// on line 5893 
// ... and create our timer and make sure that it stays rooted. 
if (millisecondsDelay != Timeout.Infinite) // no need to create the timer if it's an infinite timeout 
{ 
    promise.Timer = new Timer(state => ((DelayPromise)state).Complete(), promise, millisecondsDelay, Timeout.Infinite); 
    promise.Timer.KeepRootedWhileScheduled(); 
} 

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