首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#中的Windows服务没有及时启动

C#中的Windows服务没有及时启动
EN

Stack Overflow用户
提问于 2014-06-26 21:13:34
回答 2查看 895关注 0票数 0

我已经搜索和搜索了Windows的信息,它大多是不存在的或过时的.此外,VS 2013中没有Windows模板(我可以找到)。

我正在制作一个简单的性能监视器,它记录到文本文件CPU和RAM。我遵循了一些过时的教程,自己想出了一些东西。

当我尝试通过F5 (同事的建议)运行时,命令提示符会闪烁,关闭,然后程序结束。我认为从未调用过OnStart方法。

我可以从VS命令提示符中很好地安装服务,但是当试图启动进程时,我会得到一个错误,它没有及时启动。我甚至尝试过与服务管理器中的桌面进行交互。

我也尝试过调试和发布版本。

我看过其他一些问题,这些问题建议在OnStart方法中进行所有初始化,我认为我是这样做的(尽管我可能错了--显然我还在学习)。

有关守则:

代码语言:javascript
复制
namespace SystemMonitorD
{
    public class SystemMonitorD : ServiceBase
    {
        private Timer StateTimer { get; set; }
        private TimerCallback TimerDelegate { get; set; }
        private SystemMonitorL SysMon { get; set; }

        public SystemMonitorD()
        {
            ServiceName = "SystemMonitorD";
            CanStop = true;
            CanPauseAndContinue = true;
            AutoLog = true;
        }


        protected override void OnStart(string[] args)
        {
            SysMon = new SystemMonitorL();
            TimerDelegate = SysMon.Log;
            StateTimer = new Timer(TimerDelegate, null, SysMon.WaitTime, SysMon.WaitTime);
        }

        protected override void OnStop()
        {
            SysMon.StatusLog("Stop");
            StateTimer.Dispose();
        }

        protected override void OnPause()
        {
            SysMon.StatusLog("Pause");
            StateTimer.Change(Timeout.Infinite, Timeout.Infinite);
        }

        protected override void OnContinue()
        {
            SysMon.StatusLog("Continue");
            StateTimer.Change(SysMon.WaitTime, SysMon.WaitTime);
        }

        public static void Main()
        {
        }
    }

    public class SystemMonitorL
    {
        private readonly String _fileLocation = @"C:\Users\ian.elletson\Desktop\logD.txt";

        public int WaitTime { get; private set; }
        private IOutput Logger { get; set; }
        private List<SystemMonitor> SystemMonitors { get; set; }

        public SystemMonitorL()
        {
            WaitTime = 1000;
            Logger = new Logger(_fileLocation);
            SystemMonitors = new List<SystemMonitor>
            {
                SystemMonitorFactory.MakeSystemMonitor("CPU"),
                SystemMonitorFactory.MakeSystemMonitor("RAM")
            };
            Logger.WriteLine(string.Format("Polling every {0} second(s)", WaitTime / 1000));
        }

        public void Log(Object stateObject)
        {
            foreach (var monitor in SystemMonitors)
            {
                Logger.WriteLine(monitor.ToString());
            }
        }

        public void StatusLog(String status)
        {
            String message;
            switch (status)
            {
                case "Stop" :
                    message = "stopped";
                    break;
                case "Pause" :
                    message = "paused";
                    break;
                case "Continue":
                    message = "continued";
                    break;
                default:
                    message = "ERROR";
                    break;
            }
            Logger.WriteLine(string.Format("Logging {0} at {1}", message, TimeZone.CurrentTimeZone.ToLocalTime(DateTime.Now)));
        }
    }

    [RunInstaller(true)]
    public class SystemMonitorDInstaller : Installer
    {
        ServiceProcessInstaller ProcessInstaller { get; set; }
        ServiceInstaller ServiceInstaller { get; set; }

        public SystemMonitorDInstaller()
        {
            ProcessInstaller = new ServiceProcessInstaller();
            ServiceInstaller = new ServiceInstaller();

            ProcessInstaller.Account = ServiceAccount.LocalSystem;
            ServiceInstaller.StartType = ServiceStartMode.Manual;
            ServiceInstaller.ServiceName = "SystemMonitorD";

            Installers.Add(ServiceInstaller);
            Installers.Add(ProcessInstaller);
        }
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-06-27 14:43:25

我发现了我的问题。我丢失了Main()方法中的ServiceBase.Run(new SystemMonitorD());。解决了问题。这是我从此MSDN链接找到的。

票数 0
EN

Stack Overflow用户

发布于 2014-06-26 21:41:03

在调试windows服务时,有一件事情可以使处理起来更容易,那就是为您的服务使用Debug\Release标志。以非服务的形式逐步完成逻辑。

代码语言:javascript
复制
static void Main()
{
#if (!DEBUG)
    //RELEASE FLAG  
    System.ServiceProcess.ServiceBase[] ServicesToRun;
    ServicesToRun = new System.ServiceProcess.ServiceBase[] { new MyService() };
    System.ServiceProcess.ServiceBase.Run(ServicesToRun);
#else
    //DEBUG                
    MyService service = new MyService(); //<--Put breakpoint here before you run your service
    service.OnStart(null);    
    System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);
#endif 
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24440348

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档