2011-12-21 12 views
6

आम तौर पर लूप होता है, काम आप पूरा करना चाहते हैं दोहराया है, हो सकता है एक पाश में या शायद एक ट्रिगर या शायद कुछ और।Topshelf - हैंडलिंग सेवाओं के साथ

मैं Topshelf उपयोग कर रहा हूँ मेरे लिए एक दोहराया कार्य को पूरा करने, विशेष रूप से मैं Shelf'ing कार्यक्षमता का उपयोग कर रहा

समस्या मैं आ रही हैं कि कैसे काम के पाशन को संभालने के लिए है।

जब बूट Topshelf में सेवा चाबुक की मार, आप इसे एक वर्ग (इस मामले ScheduleQueueService में) गुजरती हैं और संकेत मिलता है अपने Start विधि है जो और यह Stop विधि है:

उदाहरण:

public class QueueBootstrapper : Bootstrapper<ScheduledQueueService> 
{ 
    public void InitializeHostedService(IServiceConfigurator<ScheduledQueueService> cfg) 
    { 
     cfg.HowToBuildService(n => new ScheduledQueueService()); 
     cfg.SetServiceName("ScheduledQueueHandler"); 
     cfg.WhenStarted(s => s.StartService()); 
     cfg.WhenStopped(s => s.StopService()); 
    } 
} 

लेकिन में मेरी StartService() विधि मैं काम मैं चल रहा हूँ दोहराने के लिए थोड़ी देर के पाश का उपयोग कर रहा है, लेकिन जब मैं सेवा बंद करने के लिए Windows के माध्यम से सेवाओं इसे रोकने के लिए विफल रहता है प्रयास करते हैं और मुझे लगता है इसकी वजह से StartService() विधि कभी नहीं समाप्त हो गया जब यह मूल रूप से बुलाया गया था।

उदाहरण:

public class ScheduledQueueService 
{ 
    bool QueueRunning; 

    public ScheduledQueueService() 
    { 
     QueueRunning = false; 
    } 


    public void StartService() 
    { 
     QueueRunning = true; 

     while(QueueRunning){ 
        //do some work 
     } 
    } 

    public void StopService()  
    { 
     QueueRunning = false; 
    } 
} 

क्या ऐसा करने का एक बेहतर तरीका है?

  1. मैं में काम चलाने के लिए नेट System.Threading.Tasks का उपयोग कर पर विचार किया है और उसके बाद हो सकता है() StopService पर धागा बंद करने

  2. शायद Quartz का उपयोग कर कार्य को दोहराने के लिए और फिर इसे हटा दें।

विचार?

उत्तर

0

मैं Topshelf के बारे में पता नहीं है विशेष रूप से, लेकिन जब एक मानक खिड़कियों सेवा लेखन आप शुरू करना चाहते हैं और जितनी जल्दी संभव हो पूरा करने के लिए घटनाओं को रोकने के। यदि स्टार्ट थ्रेड बहुत लंबा लगता है तो विंडोज मानते हैं कि यह शुरू करने में विफल रहा है, उदाहरण के लिए।

इस के आसपास पाने के लिए मैं आम तौर पर एक System.Timers.Timer का उपयोग करें। यह एक बहुत ही कम अंतराल के साथ एक बार स्टार्टअप विधि को कॉल करने के लिए सेट है (इसलिए यह लगभग तुरंत चलता है)। यह तब काम का बड़ा हिस्सा करता है।

आपके मामले में यह अपने विधि है कि पाशन है हो सकता है। फिर प्रत्येक लूप की शुरुआत में वैश्विक शट डाउन वैरिएबल की जांच करें - यदि यह सच है तो आपने लूप को छोड़ दिया है और फिर प्रोग्राम बंद हो सकता है।

आप पर जहां वास्तव में त्रुटि है, लेकिन सामान्य सिद्धांत ठीक मुझे आशा है कि होना चाहिए इस आधार पर कुछ अधिक (या शायद और भी कम) इस से जटिलता पड़ सकता है।

एक बार फिर हालांकि मैं कि इस ज्ञान topshelf, सिर्फ सामान्य सेवा विकास पर आधारित नहीं है छोड़ना होगा।

+0

इन सभी वर्षों के बाद, क्या किसी को पता है कि क्या यह वास्तव में भी Topshelf के साथ मामला है? Topshelf दस्तावेज़ीकरण में इसका कोई संकेत नहीं है और मैं यह तय करने के लिए संघर्ष कर रहा हूं कि मुझे व्यवस्थित रूप से एक नया धागा या मेरी सेवा में जब स्टार्ट() पर समान कुछ होना चाहिए। – guillaume31

3

आम तौर पर, मैं इसे कैसे संभालेगा Timer घटना है, जो StartService() के बाद कुछ क्षणों से दूर हो जाती है। घटना के अंत में, मैं एक stop ध्वज (StopService() में सेट) के लिए जाँच करेगा, यदि झंडा (जैसे अपने QueueRunning) वहाँ, तो मैं टाइमर पर एकल ईवेंट के रजिस्टर होगा नहीं है कुछ ही क्षणों में फिर से होने की ।

हम बहुत Topshelf ही है, जब मतदान फाइल सिस्टम में कुछ इसी तरह कार्य करें: https://github.com/Topshelf/Topshelf/blob/v2_master/src/Topshelf/FileSystem/PollingFileSystemEventProducer.cs#L80

अब जब कि एक Timer वस्तु के बजाय आंतरिक अनुसूचक प्रकार का उपयोग करता है, लेकिन आम तौर पर यह एक ही बात है। fiber मूल रूप से घटना को संसाधित करने के लिए थ्रेड है।

आप भविष्य प्रश्न हैं, तो आप भी Topshelf मेलिंग सूची में शामिल करने के लिए स्वागत कर रहे हैं। हम वहां पर बहुत संवेदनशील होने की कोशिश करते हैं। http://groups.google.com/group/topshelf-discuss

+0

पहला लिंक टूटा हुआ है – SteveC

+2

आप सही स्टीवसी हैं। फिक्स्ड! – Travis

1

मैं आज कुछ समान कोड पर काम कर रहा था, मैंने दुर्घटना से https://stackoverflow.com/a/2033431/981 पर ठोकर खाई और यह मेरे लिए एक आकर्षण की तरह काम कर रहा था।

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