मैंने एक विंडोज सेवा बनाई है, जो हर 60 सेकंड में नई पंक्तियों के लिए डीबी में एक निश्चित तालिका को जांचना है। जोड़े गए प्रत्येक नई पंक्ति के लिए, मुझे सर्वर पर कुछ भारी प्रोसेसिंग करने की आवश्यकता है जो कभी-कभी 60 सेकंड से अधिक समय ले सकता है।यदि पिछला थ्रेड अभी भी व्यस्त है तो टाइमर छोड़ने के लिए कैसे करें
मैंने अपनी सेवा में टाइमर ऑब्जेक्ट बनाया है, जो हर 60 सेकंड में टिकता है और वांछित विधि का आह्वान करता है।
चूंकि मैं नहीं चाहता कि यह टाइमर नई लाइनों को संसाधित करते समय टिक टिके, मैंने विधि को lock { }
ब्लॉक में लपेट लिया, इसलिए यह किसी अन्य थ्रेड द्वारा पहुंचा नहीं जा सकेगा। अब
Timer serviceTimer = new Timer();
serviceTimer.Interval = 60;
serviceTimer.Elapsed += new ElapsedEventHandler(serviceTimer_Elapsed);
serviceTimer.Start();
void serviceTimer_Elapsed(object sender, ElapsedEventArgs e)
{
lock (this)
{
// do some heavy processing...
}
}
, मैं सोच रहा हूँ -
मेरी टाइमर टिक्स हैं, और डाटाबेस पर नई पंक्तियाँ का एक बहुत पाता है, और अब प्रसंस्करण से अधिक ले जाएगा:
यह कुछ इस तरह दिखता 60 सेकंड, अगली टिक पिछले एक तक समाप्त होने तक कोई प्रसंस्करण नहीं करेगी। यह वह प्रभाव है जो मैं चाहता हूं।
लेकिन अब, पहली प्रक्रिया समाप्त होने के बाद सेवा टिमर_इलेस्ड विधि तत्काल बंद हो जाएगी, या फिर टाइमर को फिर से टिकने की प्रतीक्षा होगी।
मैं क्या करना चाहता हूं - अगर प्रसंस्करण 60 सेकंड से अधिक की आवश्यकता है, टाइमर की तुलना में थ्रेड लॉक हो जाएगा, और फिर से जांचने के लिए 60 सेकंड प्रतीक्षा करें, इसलिए मैं ऐसी परिस्थिति में कभी भी अटक जाऊंगा पिछले एक के लिए इंतजार कर रहे धागे की एक कतार।
मैं इस परिणाम को कैसे पूरा कर सकता हूं?
ऐसा करने के लिए सबसे अच्छा अभ्यास क्या है?
धन्यवाद!
का प्रयोग न करें 'ताला (यह)' - http: // stackoverflow.com/questions/251391/why-is-lockthis-bad –
ऑटोरेसेट को झूठी पर सेट करना आसान होगा, तो हमें कुछ भी लॉक करने की आवश्यकता नहीं है – javapowered