2012-08-30 17 views
12

सही ढंग से प्रतिबिंबित नहीं करती है यदि मेरी सेवा प्रारंभ या बंद हो रही है तो मेरे पास यह कोड पावरहेल स्क्रिप्ट चला रहा है।सेवा नियंत्रक स्थिति वास्तविक सेवा स्थिति

Timer timer1 = new Timer(); 

ServiceController sc = new ServiceController("MyService"); 

protected override void OnStart(string[] args) 
    { 
     timer1.Elapsed += new ElapsedEventHandler(OnElapsedTime); 
     timer1.Interval = 10000; 
     timer1.Enabled = true; 
    } 

    private void OnElapsedTime(object source, ElapsedEventArgs e) 
    { 
     if ((sc.Status == ServiceControllerStatus.StartPending) || (sc.Status == ServiceControllerStatus.Stopped)) 
     { 
      StartPs(); 
     } 
    } 

    private void StartPs() 
    { 
     PSCommand cmd = new PSCommand(); 
     cmd.AddScript(@"C:\windows\security\dard\StSvc.ps1"); 
     PowerShell posh = PowerShell.Create(); 
     posh.Commands = cmd; 
     posh.Invoke(); 
    } 

यह ठीक काम कर रहा है जब मैं cmd ​​शीघ्र लेकिन से मेरी सेवा को मारने भले ही मेरी सेवा और चल रहा है, powershell स्क्रिप्ट ही निष्पादित करने के लिए (यह कंप्यूटर पर एक फ़ाइल संलग्न कर देता है) किसी भी विचार क्यों जारी है?

+0

क्या यह कहना सही होगा कि शक्तियां इस प्रश्न के लिए ऑर्थोगोनल हैं, और * असली * प्रश्न यह है: मेरा 'स्टार्टपेन्डिंग'/'स्टॉप' चेक क्यों सही ढंग से काम नहीं करता है? –

+0

क्या आपने ब्रेकपॉइंट्स को यह देखने के लिए प्रयास किया है कि वास्तव में क्या हो रहा है? –

उत्तर

28

ServiceController.Status संपत्ति हमेशा नहीं रहता है; पहली बार अनुरोध किया जाता है कि यह आलसी मूल्यांकन किया जाता है, लेकिन (जब तक अनुरोध नहीं किया जाता) उस समय केवल; Statusके बाद के प्रश्न सामान्य रूप से वास्तविक सेवा की जांच नहीं करेंगे। इस के लिए मजबूर करने के लिए, जोड़ें:

sc.Refresh(); 

अपने .Status जांच से पहले:

private void OnElapsedTime(object source, ElapsedEventArgs e) 
{ 
    sc.Refresh(); 
    if (sc.Status == ServiceControllerStatus.StartPending || 
     sc.Status == ServiceControllerStatus.Stopped) 
    { 
     StartPs(); 
    } 
} 

कि sc.Refresh() के बिना, अगर यह Stopped था (उदाहरण के लिए) शुरू में, यह हमेशाStopped कहेंगे।

+2

इसके लिए धन्यवाद; यह बहुत खाली है अपमानजनक ... – Will

+0

उह! गंभीरता से, माइक्रोसॉफ्ट? 'स्टेटस' कॉल में रीफ्रेश क्यों न बनाएं (जैसे मैं शायद खुद को कर दूंगा) ?? या कम से कम 'स्थिति। रीफ्रेश' विधि को स्पष्ट करने के लिए विधि है। – SteveCinq

+1

वाह मैन !! @Marc आपने मेरा दिन बनाया। यह समझना स्पष्ट नहीं है कि हमें नवीनतम स्थिति के बारे में सुनिश्चित करने के लिए sc.Refresh() को कॉल करना होगा। –

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