2012-06-28 29 views
10

विंडोज सेवा में विधि कॉल के किस क्रम में होता है? हमारे पास समय-समय पर समस्या है और मुझे लगता है कि यह प्रसंस्करण को पूरा करने में बहुत लंबा समय लेने वाला है। क्या आदेश और जब तरीकों मुख्य, onStart, InitializeComponent आदि कहा जाता हो और/या जब वे बुलाया जाना चाहिएविंडोज सेवा में विधि का ऑर्डर कॉल

यह वही समस्या मुझे लगता है कि हम Error 1053 the service did not respond to the start or control request

कर रहे हैं फिर भी है, हम में आश्चर्य कर रहे हैं।

साथ ही, ऑनस्टार्ट विधि सभी प्रसंस्करण को रखने के लिए सबसे अच्छी जगह होगी?

** समाधान

कुछ समय के लिए एक परीक्षण सेवा बनाने के लिए बनाया गया है और नीचे प्रतिक्रियाओं का परीक्षण किया और बाहर समय पता चला यह पैदा कर रहा मुख्य विधि प्रसंस्करण से आ रही है और साथ ही निर्माता मुख्य विधि में बुलाया जा रहा है समय के लिए। सबस्टार्ट पर सब कुछ ले जाना और साथ ही थ्रेड को कताई करना भी काम करना प्रतीत होता है। विवरण यहाँ। http://www.adamthings.com/post/2012/06/28/error-1053-the-service-did-not-respond-to-the-start-or-control-request-in-a-timely-fashion/

+0

ऑनस्टार्ट को एक और धागा शुरू करना चाहिए जो आपकी सभी प्रसंस्करण को संभालता है, इसलिए विधि तुरंत वापस आ सकती है। मेरे अनुभव में यह सबसे अच्छा काम करता है। मैं InitializeComponent में कुछ भी नहीं डालूंगा। – Mangist

+0

ऑनस्टॉप को थ्रेड को निरस्त करना चाहिए, और इसे पूरा करने के लिए प्रतीक्षा करें :) – Mangist

+1

आप ब्रेकपॉइंट्स डालकर पता लगा सकते हैं। – usr

उत्तर

6

OnStart() विधि में ब्लॉक न करें। ऐसा लगता है जैसे आप यह कर रहे हैं।

OnStart() विधि में एक अलग थ्रेड बनाएं और वहां से बाहर निकलें।

मैं इस परीक्षण नहीं किया है, लेकिन करने के लिए कुछ इसी तरह:

protected override void OnStart(string[] args) 
{ 
    var worker = new Thread(DoWork); 
    worker.IsBackground = false; 
    worker.Start(); 

    base.OnStart(args); 
} 

private void DoWork() 
{ 
    while (!_stopRequested) // (set this flag in the OnStop() method) 
    { 
     // processing goes here 
    } 
} 

घटनाओं, प्रत्येक विधि में सिर्फ सेटअप ट्रेस बयान के आदेश के बारे में आपके प्रश्न का उत्तर करने के लिए। मुझे यकीन नहीं है कि यह कितना उपयोगी होगा। संदेश (सेवा ने प्रारंभ अनुरोध का जवाब नहीं दिया ...) जो आप प्राप्त कर रहे हैं वह एक विधि में अवरुद्ध (या बहुत लंबा समय लेना) का संकेत है जो अपेक्षाकृत तेज़ी से निष्पादित होना चाहिए।

+0

यह मेरे विचारों को आगे बढ़ने में बहुत मददगार था। आपके उत्तर के लिए धन्यवाद। मूल पोस्ट पर टिप्पणियों में मेरे निष्कर्ष पोस्ट किया। – Adam

6

मुझे विश्वास है कि आदेश

  • Main (Main is the entrypoint to just about every app in windows, services not excluded) है
  • (Main बुलाना चाहिए) InitializeComponent
  • OnStart (यह वास्तव में मांग पर कहा जाता है ... मूल रूप से जब प्रारंभ कहा जाता है। ..thus क्यों Main और InitializeComponent पहले से होता है)

अपना कोड कहां रखना है, मैं Main में कैश किए जा सकने वाले किसी भी कोड को डालने का सुझाव दूंगा, और OnStart के अंदर प्रत्येक स्टार्ट पर रीसाइक्लिंग करने वाला कोई भी कोड। हालांकि, आपको OnStart में कोई वास्तविक प्रसंस्करण नहीं करना चाहिए, बस प्रारंभ करना। अपने तर्क का बड़ा हिस्सा करने के लिए एक अलग धागा का प्रयोग करें।

इसके अलावा, MSDN is helpful with this

+0

प्रतिक्रिया के लिए धन्यवाद , यह सहायक था। मूल पोस्ट पर टिप्पणियों में मेरे निष्कर्ष पोस्ट किया। – Adam