关于windows 服务的实践
最近工作上有定时更新数据库中某产品数量的要求,主要是同步记录显示产品的使用情况。开始是在Global.asax文件中通过写计时器进行更新。但是数据库中的数据还是没有更新。而写的txt日志上有记录。网上看了很多类型的情况。有人说是iis回收了。并且是只是第一个访问的用户才会对设置的定时器有效。于是,根据博友的建议尝试写个window服务。
以前也没有弄过,找了下资料。依葫芦画瓢新建项目->选择windows 服务,在产生的Service1.cs文件中打开右键查看代码。在对应的方法上写了计时器和数据操作。
声明定时器: System.Timers.Timer timer1;
OnStart方法:
timer1 = new System.Timers.Timer();
timer1.Interval = 600000; //设置计时器事件间隔执行时间
timer1.Elapsed += new System.Timers.ElapsedEventHandler(timer1_Elapsed);
timer1.Enabled = true;
//执行SQL语句或其他操作
try
{
int starttime = DateTime.Now.Hour;
if (starttime ==20)
{
DataClassesDataContext db = new DataClassesDataContext();
System.IO.StreamWriter sw = System.IO.File.AppendText("D:\\1.txt");
string w = "也许你也阳光,但是不够有钱。" + "\r\n"; ;
sw.Write(w);
sw.Close();
A_Se h = new A_Se();
h.Location = "迪拜";
h.Name = "chen";
h.Num = 10;
h.Code = "001";
h.Username = "小名";
h.Updatedate = DateTime.Now;
db.A_Se.InsertOnSubmit(h);
db.SubmitChanges();
}
} catch (Exception ex){
Console.Write(ex.Message);
}
}
接着是在视图界面点击添加安装程序。会产生ProjectInstaller.cs。打开会有serviceProcessInstaller1组件,点击设置属性的account的值为LocalSystem。serviceInstaller1组件设置属性ServiceName的值.这就是你在任务管理器,服务里面看到的那个名称,StartType设置为Automatic自动。在右键代码里面添加如下代码:
public ProjectInstaller()
{
InitializeComponent();
this.Committed += new InstallEventHandler(ProjectInstaller_.Committed);
}
private void ProjectInstaller_.Committed(object sender, InstallEventArgs e) {
//参数为服务的名字
System.ServiceProcess.ServiceController controller = new System.ServiceProcess.ServiceController("ServiceName的值");
controller.Start();
}
在生成菜单栏点击生成(解决方案的名称)。然后通过运行vs的命令提示 installutil window服务路径进行安装,安装启动后我们就可以在任务管理器的服务选项卡看到我们的那个服务了。卸载的命令:installutil /u window服务路径.这里安装的时候一般要放到系统对应的框架目录下,否则会安装异常。我这里用了linq to sql.查看系统日志时提示sa用户提示密码不对。但我一直连接都是sa账户密码应该没有问题,后来我更改连接为本地(.)就可以更新数据了。
很多东西做过了不记下来很快就忘记了。所以决定以后都写下自己经历过的新知识点。好好实践总结提高自己。