我的解决方案包含很多项目和窗口服务。我在windowservice的应用程序端修改了编码,之后我复制了exe 关于该服务(F:\ Components \ Console \ Bin \ service.exe) 之后进入安装路径(C:\ Program Files \ syscon \ Monitor \ service.exe) 从'services.msc'停止windowservice。现在我在调试时得到服务的价值,这是以前没有得到的。但是现在当我开始 来自'services.msc'的服务我收到此错误 “无法在本地计算机上启动操作的sentinel windows资源监视器服务。错误1053: 该服务未及时响应启动或控制请求“ 可以告诉我一个解决方案吗
答案 0 :(得分:2)
我们在工作期间创建了许多服务,并且我发现一种非常有用的调试方法如下:
使您的服务成为“双重应用程序”,可以作为服务运行,也可以作为普通的Windows窗体应用程序运行,由某些命令行参数控制。我将“/ gui”传递给我的服务。
在void Main(string[] args)
中,我检查参数:
如果缺少,我执行代码来实例化服务(Visual Studio生成的代码)。
如果它存在,我运行代码来创建一个普通的Windows窗体应用程序,其中主窗体实例化服务并相应地调用OnStart
和OnStop
(您必须创建到期的包装方法)了解OnStart
和OnStop
)。
当然,您必须手动添加对Windows窗体程序集的引用并自行添加Application.Run(...)
之类的代码,但调试功能会大大提高,而无需经历“停止服务,复制文件,启动服务”的麻烦,失败“ - 例程。
最有可能的是,OnStart
代码中存在一个错误,导致实例退出该例程,服务管理器一直在等待。
修改强>
以下是根据参数创建服务/ gui的方式的代码示例:
static void Main(string[] args)
{
if (args.Length > 0 && args[0].Equals("/gui"))
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new FrmGui());
}
else
{
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[] { new SampleService() };
ServiceBase.Run(ServicesToRun);
}
}