2011-09-13 24 views
11

मेरे पास एक विंडोज सेवा है जिसे मैं डीबग करने की कोशिश कर रहा हूं। अब यह शुरू करने में विफल रहता है भले ही वर्तमान कोड काम करने के लिए प्रयोग किया जाता है। त्रुटि है:विंडोज सेवा शुरू नहीं होगी (त्रुटि 1053)

विंडोज स्थानीय कंप्यूटर

1053 त्रुटि पर MyService सेवा प्रारंभ नहीं हो सका: सेवा प्रारंभ या नियंत्रण एक समय पर फैशन में अनुरोध का जवाब नहीं था।

त्रुटि को अलग करने के लिए, मैंने सबकुछ टिप्पणी करने का प्रयास किया। मुख्य विधि इस तरह दिखती है:

TextWriter tt = new StreamWriter(@"C:\startup.text", true); 
tt.WriteLine("Starting up the service"); 
tt.Close(); 

ServiceBase[] ServicesToRun; 
ServicesToRun = new ServiceBase[] 
    { 
     new MyService() 
    }; 

TextWriter tt2 = new StreamWriter(@"C:\startup.text", true); 
tt2.WriteLine("Run..."); 
tt2.Close(); 

यह लॉग फ़ाइल में "सेवा शुरू करना" और "चलाएं ..." दोनों को प्रिंट करता है। मैंने MyService के अंदर भी छीन लिया ताकि यह खाली हो। किसी भी कोड के चारों ओर एक कोशिश/पकड़ है, जो अब ऊपर की तरह कुछ लॉग लाइनों में कम हो गया है। मैं कभी भी कैच स्टेटमेंट में प्रवेश नहीं करता, जो इसे लॉग करता।

onStart में सब कुछ बाहर टिप्पणी की गई है:

protected override void OnStart(string[] args) 
{ 
} 

तो मैं विचारों से बाहर मूल रूप से कर रहा हूँ। मैंने सोचा कि त्रुटि इसलिए थी क्योंकि स्टार्ट विधि कभी खत्म नहीं होती है (या 30 सेकंड के भीतर नहीं होती है)। क्या कोई अन्य विधि है जिसे बुलाया जाता है? किसी भी विचार की सराहना की जाती है।

अतिरिक्त जानकारी: MyService में निर्माता खाली है। अगर मैं कुछ थ्रेड डालता हूं। नींद (5000) लाइनें, तो त्रुटि 1053 पॉप अप के बारे में त्रुटि संदेश में अधिक समय लगता है। प्रतीत होता है कि मुख्य विधि से बाहर निकलना पड़ता है (त्रुटि के बिना)। बिना क्रिया अपवाद अधिसूचना की सदस्यता के लिए

ServiceBase[] servicesToRun = new ServiceBase[] 
           { 
            new MyService() 
           }; 
ServiceBase.Run(servicesToRun); 

यह भी हो सकता है एक अच्छा विचार:

static void Main() { 
    ... 
    AppDomain.CurrentDomain.UnhandledException 
             += CurrentDomain_UnhandledException; 
    ... 
} 

private static void CurrentDomain_UnhandledException(
               Object sender, 
               UnhandledExceptionEventArgs e) { 

    if (e != null && e.ExceptionObject != null) { 
     // log exception: 
    } 
} 

और onStart के लिए निम्न ट्राई/कैच जोड़ने क्योंकि नेट/

+0

सुनिश्चित करें कि आप सभी अनचाहे अपवादों को पकड़ लें और लिखें आपके लॉग में एम। उदाहरण के लिए: http://stackoverflow.com/questions/58280/unhandledexception-handler-in-a-net-windows- सेवा ... जो आपको असफल होने के बारे में कुछ और जानकारी दे सकती है। –

उत्तर

15

आप ServiceBase.Run कॉल याद कर रहे हैं एससीएम अपवाद निगलता है:

protected override void OnStart(String[] args) { 
    try { 

    } catch(Exception e) { 
     // log exception: 
     throw; 
    } 
} 
+1

यदि आप सेवा प्रारंभिकरण को डीबग करना चाहते हैं तो आप प्रारंभिक कोड में System.Diagnostics.Debugger.Break() पर कॉल कर सकते हैं। जब यह लाइन पहुंच जाती है तो विंडोज आपको पूछेगा कि क्या आप डीबगर लॉन्च करना चाहते हैं, जिससे आप उस बिंदु से सेवा को डीबग कर सकेंगे। – Polyfun

+1

धन्यवाद। ServiceBase.Run (ServicesToRun); प्रक्रिया में लाइन टिप्पणी की गई थी। –

+1

मेरे लिए, यह 'serviceBase.Run (serviceToRun) को कॉल किए बिना चलाने के लिए डीबग सशर्त सेट था; कई जवाबों के बाद ' – absynce

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