2010-09-15 2 views
6

मैं विंडोज सेवाओं के साथ काम करने के लिए एक पूर्ण शुरुआत कर रहा हूं। मैं एक बुनियादी कंकाल सेवा के लिए बाहर काम किया है और मैं वर्तमान में यह कर रहा हूं:विंडोज सेवा से एक्सई कैसे चलाएं और एक्सई प्रक्रिया छोड़ने पर सेवा बंद करें?

protected override void OnStart(string[] args) 
    { 
     base.OnStart(args); 
     Process.Start(@"someProcess.exe"); 
    } 

सिर्फ आग बंद कार्यक्रम के शुरू में exe करने के लिए।

हालांकि, मैं जब प्रक्रिया शुरू कर दी से exe इस्तीफा सेवा बंद ही करना चाहते हैं। मैं बहुत यकीन है कि मैं (कुछ मैं भी साथ शुरुआत) सूत्रण किसी प्रकार का क्या करने की जरूरत है, लेकिन मैं यह कैसे काम करता के समग्र रूपरेखा, और न ही विशिष्ट तरीके के बारे में सुनिश्चित भीतर ही से एक प्रक्रिया को रोकने के नहीं कर रहा हूँ । क्या आप इस के लिए सामान्य प्रक्रिया के साथ मेरी मदद कर सकते हैं (यानी ऑनस्टार्ट से धागा शुरू करें, फिर क्या ...?)? धन्यवाद।

ServiceController वर्ग का उपयोग करें);

उत्तर

9

आप थ्रेडिंग के लिए BackgroundWorker का उपयोग कर सकते हैं, प्रक्रिया को समाप्त करने तक प्रतीक्षा करने के लिए Process.WaitForExit() का उपयोग करें।

आप सही हैं कि आपको कुछ थ्रेडिंग करना चाहिए, OnStart में बहुत से काम करने से सेवा शुरू करते समय विंडोज से ठीक से शुरू नहीं होने के बारे में त्रुटियां प्रस्तुत की जा सकती हैं।

protected override void OnStart(string[] args) 
{ 

    BackgroundWorker bw = new BackgroundWorker(); 
    bw.DoWork += new DoWorkEventHandler(bw_DoWork); 
    bw.RunWorkerAsync(); 
} 

private void bw_DoWork(object sender, DoWorkEventArgs e) 
{ 
    Process p = new Process(); 
    p.StartInfo = new ProcessStartInfo("file.exe"); 
    p.Start(); 
    p.WaitForExit(); 
    base.Stop(); 
} 

संपादित तुम भी एक वर्ग के सदस्य के लिए Process p ले जाएँ और OnStop में प्रक्रिया को रोकने सुनिश्चित करें कि आप सेवा फिर से बंद कर सकते हैं कि बनाने के लिए करने के लिए करता है, तो exe बिगड़ चला जाता है कर सकते हैं।

protected override void OnStop() 
{ 
    p.Kill(); 
} 
+0

धन्यवाद, यह काफी हद तक काम करता था जैसा कि मैंने आशा की थी। – xdumaine

1

someProcess.exe कॉलिंग सेवा को रोकने के लिए someLogic होना चाहिए।

// Toggle the Telnet service - 
// If it is started (running, paused, etc), stop the service. 
// If it is stopped, start the service. 
ServiceController sc = new ServiceController("Telnet"); 
Console.WriteLine("The Telnet service status is currently set to {0}", 
        sc.Status.ToString()); 

if ((sc.Status.Equals(ServiceControllerStatus.Stopped)) || 
    (sc.Status.Equals(ServiceControllerStatus.StopPending))) 
{ 
    // Start the service if the current status is stopped. 

    Console.WriteLine("Starting the Telnet service..."); 
    sc.Start(); 
} 
else 
{ 
    // Stop the service if its status is not set to "Stopped". 

    Console.WriteLine("Stopping the Telnet service..."); 
    sc.Stop(); 
} 

// Refresh and display the current service status. 
sc.Refresh(); 
Console.WriteLine("The Telnet service status is now set to {0}.", 
        sc.Status.ToString()); 

कोड ऊपर दिए गए पृष्ठ से है।

+0

धन्यवाद, इस तरह यह अंतिम परिणाम हासिल करेगी दिखता है - अगर मैं exe रूप में अच्छी तरह विकसित कर रहा हूँ। क्या समाधान के मुकाबले यह अधिक कामकाज नहीं है, यद्यपि? और यह केवल यह मानने पर काम करेगा कि मैं .exe लिख रहा हूं। मान लें कि मेरे पास exe के स्रोत के लिए उपयोग नहीं है, और यह अभी भी विंडोज़ सेवा के माध्यम से सक्षम होना चाहिए। – xdumaine

2

आप एक ServiceController उपयोग करने के लिए यह करने के लिए, यह एक Stop विधि है की है। सुनिश्चित करें कि आपकी सेवा में CanStop संपत्ति सत्य पर सेट है।