ईमानदारी से, मुझे यह कहना होगा कि मुझे लगता है कि आप यहां पीटा पथ से थोड़ा दूर हैं।
सबसे पहले, वास्तविक कोड तैनात वास्तव में मतलब नहीं है; कार्यकर्ता थ्रेड सिग्नल की प्रतीक्षा कर रहा है लेकिन किसी भी कारण से - यह वास्तव में किसी भी प्रकार के लूप में नहीं है या संसाधन की प्रतीक्षा नहीं कर रहा है। दूसरा, अगर आप बंद संकेत प्राप्त करने के बाद कुछ (शायद छोड़े गए) कार्यकर्ता में सफाई कोड निष्पादित करने की जरूरत थी, तो अपनी सेवा नहीं कार्यकर्ता धागा को साफ करने के लिए पर्याप्त समय दे सकता है।
लेकिन, मूल रूप से, आपने जो कुछ किया है, वह समस्या को एक अलग धागे में ले जाया गया है। यह सेवा सेवा नियंत्रक के लिए उत्तरदायी नहीं रख सकता है लेकिन यह डिजाइन समस्या हल नहीं होती है - और यह धागे और mutexes का उपयोग करके अनावश्यक जटिलता का एक बहुत कहते हैं, आखिरकार यह आपकी सेवा को डीबग करने के लिए कठिन होगा यदि आपको कभी भी आवश्यकता हो।
मान लीजिए कि आप कुछ कोड हर 5 सेकंड पर अमल करने की जरूरत है करते हैं। विचार है कि, 5 सेकंड "प्रतीक्षा" करने के बजाय, आप नियंत्रण को उलटा करते हैं, और टाइमर को आपके काम का आह्वान करने दें।
यह बुरा है:
protected override void OnStart(string[] args)
{
while (true)
{
RunScheduledTasks(); // This is your "work"
Thread.Sleep(5000);
}
}
यह अच्छा है:
public class MyService : ServiceBase
{
private Timer workTimer; // System.Threading.Timer
protected override void OnStart(string[] args)
{
workTimer = new Timer(new TimerCallback(DoWork), null, 5000, 5000);
base.OnStart(args);
}
protected override void OnStop()
{
workTimer.Dispose();
base.OnStop();
}
private void DoWork(object state)
{
RunScheduledTasks(); // Do some work
}
}
यह है कि। नियमित अंतराल पर काम करने के लिए आपको बस इतना करना है। जब तक कार्य एक समय में सेकंड के लिए नहीं चलता है, तब तक आपकी सेवा सेवा नियंत्रक के प्रति उत्तरदायी रहेगी। तुम भी इस परिदृश्य के तहत रोक का समर्थन कर सकते हैं:
protected override void OnPause()
{
workTimer.Change(Timeout.Infinite, Timeout.Infinite);
base.OnPause();
}
protected override void OnContinue()
{
workTimer.Change(0, 5000);
base.OnContinue();
}
केवल समय था जब आप अपनी सेवा में कार्यकर्ता धागे पैदा कर रही है काम अपने आप में एक बहुत लंबे समय के लिए चला सकते हैं जब शुरू करने की आवश्यकता है और आप में रद्द करने की क्षमता की जरूरत है मध्य। इसमें डिज़ाइन प्रयासों का एक अच्छा सौदा शामिल है, इसलिए मैं यह सुनिश्चित करने के बिना इसमें शामिल नहीं होगा कि यह आपके परिदृश्य से संबंधित है।
आपकी सेवा में बहुप्रचारित अर्थशास्त्र शुरू करना शुरू करना सबसे अच्छा नहीं है जब तक कि आपको वास्तव में इसकी आवश्यकता न हो। यदि आप काम की छोटी-छोटी इकाइयों को निर्धारित करने की कोशिश कर रहे हैं, तो आपको निश्चित रूप से इसकी आवश्यकता नहीं है।
आपके चर के नाम कैपिटलकृत क्यों हैं? –
वहां। ठीक कर दिया। –