2010-08-13 23 views
7

मेरे पास एक ऐसी सेवा है जो प्रत्येक 10 सेकंड में डेटाबेस हिट करती है और यदि कोई है तो डेटा प्राप्त करता है। बात यह है कि इस डेटा को संसाधित करने में 30 सेकंड तक लग सकते हैं। यदि मैं 10 सेकंड अंतराल के साथ टाइमर का उपयोग करता हूं तो सेवा को दो बार एक ही डेटा मिल जाएगा।सी # सेवा में टाइमर बनाम थ्रेड

प्रभाव मैं (बस दृश्य के लिए) हासिल करने की कोशिश:

while(true) 
{ 
    if(Getnrofrows() > 0) 
     do stuff 
    else 
     sleep for 10 sec 
} 

पीपीएल कह Thread.Sleep उत्पादन सेवाओं में एक बुरा विचार है, मैं कैसे टाइमर के साथ ऐसा कर सकता हूं?

/माइक

+4

क्या वे यह भी कह रहे हैं * क्यों * थ्रेड। नींद एक बुरा विचार है? – Heinzi

उत्तर

10

आप गलत पर टाइमर संपत्ति ऑटो रीसेट सेट करने का प्रयास किया, और टाइमर फिर से सक्रिय करने के लिए जब ताज़ा डेटा की प्रक्रिया

using System; 

public class PortChat 
{ 
    public static System.Timers.Timer _timer; 
    public static void Main() 
    { 

     _timer = new System.Timers.Timer(); 
     _timer.AutoReset = false; 
     _timer.Interval = 100; 
     _timer.Elapsed += new System.Timers.ElapsedEventHandler(_timer_Elapsed); 
     _timer.Enabled = true; 
     Console.ReadKey(); 
    } 

    static void _timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
    { 
     //Do database refresh 
     _timer.Enabled = true; 
    } 
} 
+0

बिल्कुल वही जो मैं खोज रहा था। धन्यवाद! –

+0

क्षमा करें, लेकिन यह _timer.Enabled = विलुप्त घटना में गलत नहीं होना चाहिए? यदि यह मुख्य रूप से किया जाता है तो यह फिर से सच क्यों हो जाता है? – Neale

+0

@Neale, मूल प्रश्न लूप को रोकने के बारे में था जब तक कुछ खत्म नहीं हुआ। जब हम _timer.Autoreset = false डालते हैं तो लूप सक्षम करने के बाद केवल एक बार लूप होगा। तो जब हमारे लूप पढ़ने के साथ समाप्त होता है तो हम इसे – adopilot

0

से अधिक इस दृष्टिकोण के साथ कुछ गलत नहीं है। एक नींद धागा किसी भी CPU चक्र का उपभोग नहीं करता है।

यदि आपको हर एक्स सेकंड में कुछ करने की ज़रूरत है, तो टाइमर जाने का रास्ता है। यदि, दूसरी ओर, आप एक्स सेकंड के लिए रोकना चाहते हैं, तो थ्रेड। सोना उचित है।

+0

सक्षम करके फिर से टाइमर सक्रिय करेंगे। एक नींद धागा किसी भी सीपीयू चक्र का उपभोग नहीं कर सकता है लेकिन यह टाइमर ऑब्जेक्ट की तुलना में कई कर्नेल संसाधनों का उपभोग करेगा – Zuuum

1

मुझे बदसूरत कोड के साथ समाप्त होने के अलावा अन्य सभी में नींद का उपयोग करने में कोई समस्या नहीं दिखाई दे रही है।

आपके प्रश्न का उत्तर करने के लिए:

public class MyTest 
{ 
    System.Threading.Timer _timer; 


    public MyTest() 
    { 
     _timer = new Timer(WorkMethod, 15000, 15000); 
    } 


    public void WorkMethod() 
    { 
     _timer.Change(Timeout.Infinite, Timeout.Infinite); // suspend timer 

     // do work 

     _timer.Change(15000, 15000); //resume 

    } 
} 
0

Thread.Sleep नहीं बुरा अपने आप में एक सेवा में, सिर्फ इतना है कि आप तो अपने कार्यकर्ता धागा एक घंटे के लिए सो जाओ नहीं होना चाहिए सेवा आदेशों के लिए उत्तरदायी होने की जरूरत है, है, लेकिन इसके बजाय छोटी अवधि के लिए सोने की जरूरत है और फिर जागते हैं और सुनते हैं कि सेवा के सेवा नियंत्रक भाग कुछ कारणों से इसे रोकने के लिए कह रहा है।

आप इसे बनाना चाहते हैं ताकि अगर व्यवस्थापक आपकी सेवा को रोकने के लिए कहता है, तो यह जल्दी से रुक जाएगा ताकि उसे कोई टाइमआउट संदेश नहीं मिलेगा जहां व्यवस्थापक यह सुनिश्चित नहीं कर सकता कि आपकी सेवा बंद हो गई है और मशीन या इसी तरह रीबूट करना सुरक्षित है।

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