前提:我做了另一个控制台的项目,它的作用是从别人的接口读数据存入自己的DB.在外部调试成功生成了EXE.
下面正式开始,像前面几篇一样做同样的步骤,新建一个window service项目,把service1.cs 改为“DBService1.cs”,放一个日志控件“eventLog1”。
在“DBService1.cs“中直接写代码:
//构造函数中更改代码
public DBService1()
{
InitializeComponent();
//添加代码如下
if (!System.Diagnostics.EventLog.SourceExists("MyWinDBSource"))
{
System.Diagnostics.EventLog.CreateEventSource(
"MyWinDBSource", "MyNewWinDBLog");
}
eventLog1.Source = "MyWinDBSource";
eventLog1.Log = "MyNewWinDBLog";
}
//重写OnStart
Process proc = new Process();
protected override void OnStart(string[] args)
{
eventLog1.WriteEntry("In OnStart");
proc.StartInfo.FileName = "FlightInfo.exe";//注意如果不是调用系统程序,则需要输入全路径 E:\\Test\\WinDBService1\\WinDBService1\\bin\\Debug\\
proc.StartInfo.CreateNoWindow = false;
proc.StartInfo.UseShellExecute = false;
proc.Start();
//proc.WaitForExit();//关键,等待外部程序退出后才能往下执行
}
//重写OnStop()
protected override void OnStop()
{
eventLog1.WriteEntry("In onStop.");
//proc.Close();
//proc.Kill();
}
//重写OnContinue()
protected override void OnContinue()
{
eventLog1.WriteEntry("In OnContinue.");
//proc.Start();
//proc.WaitForExit();//关键,等待外部程序退出后才能往下执行
}
然后回到“DBService1.cs”的设计页右键如下图,(前几篇少放了个图,现在补上)
VS环境自动增加一个类,名字为“ProjectInstaller.cs”
对于该类的设置如(一)所示。
到此该服务已写完毕。另外写的过程中遇到了(三)的问题,对于本例的解决方案是把OnStart()中“proc.WaitForExit();”这句话注释掉,我想可能是服务一直处于启动状态正是因为进程一直在执行,等待退出,而本身数据量较大,进程一时半会又结束不掉,导致服务处于“启动”状态。注释掉后,服务正常启动,弄了好久才搞定的,所以写出来,备案一下。
“开始”-->"运行",录入“services.msc”,查看我们自己的服务“DBService1”,如下图: