在很多应用中需要做windows服务来操作数据库等操作,比如
(1)一些非常慢的数据库操作,不想一次性去做,想慢慢的通过服务定时去做,比如定时为数据库备份等
(2)在.net Remoting中利用windows服务来做Host

利用vs.net我们可以在几分钟之内建立其windows服务,非常简单

下面说一下步骤
1. 新建一个项目
2. 从一个可用的项目模板列表当中选择Windows服务
3. 设计器会以设计模式打开
4. 从工具箱的组件表当中拖动一个Timer对象到这个设计表面上 (注意: 要确保是从组件列表而不是从Windows窗体列表当中使用Timer) 

--注意事项:【推荐】【血的教训】C# windows服务程序中的Timer控件的问题
5. 设置Timer属性,Interval属性200毫秒(1秒进行5次数据库操作)
6. 然后为这个服务填加功能
7.双击这个Timer,产生事件“private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e){...}”方法,然后在里面写一些数据库操作的代码,比如

代码

SqlConnection conn=new SqlConnection("server=127.0.0.1;database=test;uid=sa;pwd=275280");
SqlCommand comm
=-new SqlCommand("insert into tb1 ('111',11)",conn);
conn.Open();
comm.ExecuteNonQuery();
conn.Close();

 

 

附:也可写在记事本中

代码

   FileStream fs = new FileStream(@"d:\My Sample Service.txt", FileMode.OpenOrCreate, FileAccess.Write);
   StreamWriter m_streamWriter 
= new StreamWriter(fs);
   m_streamWriter.BaseStream.Seek(
0, SeekOrigin.End);
   m_streamWriter.WriteLine(
"My Sample Service:       " + DateTime.Now.ToString() + "\n");
   m_streamWriter.Flush();
   m_streamWriter.Close();
   fs.Close();

 

8. 将这个服务程序切换到设计视图
9. 右击设计视图选择“添加安装程序”
10. 切换到刚被添加的ProjectInstaller的设计视图
11. 设置serviceInstaller1组件的属性: 
    1) ServiceName = My Sample Service
    2) StartType = Automatic (开机自动运行)
12. 设置serviceProcessInstaller1组件的属性  Account = LocalSystem
13.让服务运行时,开始让Timer控件起作用,即在OnStart事件中添加timer1.Start();

protected override void OnStart(string[] args)
 {
   timer1.Start();
 }

 

14. 改变路径到你项目所在的bin\Debug文件夹位置(如果你以Release模式编译则在bin\Release文件夹)
15. 执行命令“InstallUtil.exe MyWindowsService.exe”注册这个服务,使它建立一个合适的注册项。(InstallUtil这个程序在WINDOWS文件夹\Microsoft.NET\Framework\v1.1.4322下面)

 

--安装技巧:把“InstallUtil.exe ”文件拷贝到“MyWindowsService.exe”所在的目录,用鼠标把“MyWindowsService.exe”托放到“MyWindowsService.exe”图标上即可快速安装,就不用向上面在命令控制台中输入相关命令。

16. 右击桌面上“我的电脑”,选择“管理”就可以打计算机管理控制台
17. 在“服务和应用程序”里面的“服务”部分里,你可以发现你的Windows服务已经包含在服务列表当中了
18. 右击你的服务选择启动就可以启动你的服务了
看看数据库是不是一秒多了5个记录啊

需要注意的是:
如果你修改了这个服务,路径没有变化的话是不需要重新注册服务的,

如果路径发生了变化,需要先卸载这个服务InstallUtil.exe -u参数,然后再重新安装这个服务,不能直接安装。

还有就是windows服务是没有界面的,不要企图用控制的输出方式来输出一些信息,你只能添加一个EventLog,通过WriteEntry()来写日志。

关于怎么用windows服务来做一个远程服务可以看一下
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnnetsec/html/SecNetHT15.asp

 

 

实例下载

 

 

 

 

 

 

 

Feedback

#1楼 [楼主] 2005-03-28 17:38 k      
也太简单了吧
  回复  引用  查看    


 

#2楼  2005-05-17 14:10 一颗色儿      
要被我的机器气疯了。
近来不知怎么回事,Account = LocalSystem的时候怎么都不能启动服务,只能设成./administrator
然后添加一个EventLog,通过WriteEntry()来写日志也不成功。
还有安装的Messaging.MessageQueue怎么删也删不掉。。。

难道真的要我重装机器?

  回复  引用  查看    


 

#3楼 60.176.53.* 2005-10-18 09:36 天仇 [未注册用户]
我按照上面的作了一遍,不知道是哪步做错了。在 执行命令“InstallUtil.exe MyWindowsService.exe”的时候,提示错误: 在“安装”阶段发生异常。System.ComponentModel.Win32Exception:指定的服务已存在。…………受影响的参数是: assemblypath=e:\windowserver\bin\debug\mywindowserver.exe
logfile=e:\windowserver\bin\debug\mywindowserver.InstallLog
…………
已完成事务处理安装
安装失败,已执行回滚。
知道的大虾告诉我一下

  回复  引用    


 

#4楼 [楼主] 2005-10-18 09:41 lovecherry      
先用-u卸载服务,或者换个服务名,服务已经存在
  回复  引用  查看    


 

#5楼 218.108.1.* 2005-10-18 15:46 天仇 [未注册用户]
太感谢了。问题总算解决了。不过我 又建了一个windows服务程序后,发觉这两个服务不能并存,当服务里有个服务后,再次执行命令“InstallUtil.exe “的时候, 提示仍然是:指定的服务已存在。他们生成的exe文件名、路径都不一样。”或者换个服务名“,到底哪个才算是服务名呢。再次请教一下
  回复  引用    


 

#6楼 [楼主] 2005-10-18 16:00 lovecherry      
11. 设置serviceInstaller1组件的属性:
1) ServiceName = My Sample Service
2) StartType = Automatic (开机自动运行)

这里的1)就是服务名字这个不能相同

  回复  引用  查看    


 

#7楼  2005-12-12 02:12 hyde      
TO:天仇
貌似和CLSID或者PUID有关吧

  回复  引用  查看    


 

#8楼 222.66.20.* 2006-01-24 11:35 方 [未注册用户]
提示:“无法验证的图象”
怎么回事?

  回复  引用    


 

#9楼  2006-03-25 17:39 仰天一笑      
写的很好,我已收藏,但是请仁兄把sql写正确
  回复  引用  查看    


 

#10楼 60.191.36.* 2006-04-12 10:51 和平 [未注册用户]
弹出一对话框,要求输入用户名跟密码
我输入之后出现以下错误,没装上。
System.ComponentModel.Win32Exception

  回复  引用    


 

#11楼 [楼主] 2006-04-12 11:40 lovecherry      
设置serviceProcessInstaller1组件的属性 Account = LocalSystem

  回复  引用  查看    


 

#12楼 60.191.36.* 2006-04-12 12:56 和平 [未注册用户]
不错,已解决。谢谢。
  回复  引用    


 

#13楼 60.191.36.* 2006-04-12 12:56 和平 [未注册用户]
不错,已解决。谢谢。
  回复  引用    


 

#14楼 60.190.228.* 2006-06-08 11:03 computer_li [未注册用户]
`
  回复  引用    


 

#15楼 60.17.25.* 2006-08-05 16:45 tianke3477 [未注册用户]
能够在服务看见安装的服务,但是不能启动

提示:无法启动这个服务
错误 1053:服务没有及时响应启动或控制请求

请问这个可能是什么原因造成的

  回复  引用    


 

#16楼 218.90.165.* 2006-08-17 15:07 Judith [未注册用户]
我在定时器里的代码怎么不执行呢?
  回复  引用    


 

#17楼 61.191.24.* 2006-10-08 17:02 鹏万里程 [未注册用户]
我的在安装时候出现:
System.ComponentModel.Win32Exception: 帐户名无效或不存在,或者密码对于指定的帐户名无效
我用的是VS2005

  回复  引用    


 

#18楼 61.191.24.* 2006-10-08 17:03 鹏万里程 [未注册用户]
恳求哪位大侠帮忙
  回复  引用    


 

#19楼 [楼主] 2006-10-08 17:21 lovecherry      
选择loalservice啊
  回复  引用  查看    


 

#20楼 60.208.111.* 2006-11-07 16:56 realism [未注册用户]
我用C#写了一个windows服务,在里面调用了其它DLL里写的方法,那个DLL也是C#写的,结果在连数据库的时候总是出错(但是WEB页面调用的时候没有问题),连接数据库信息是放到哈希表里的做为全局变理,而且写连接信息的类用了序列化,我都快晕了,不知道这是什么原因。
  回复  引用    


 

#21楼 60.176.198.* 2007-07-21 10:44 原来的我 [未注册用户]
请教大虾:
我的Timer设置的是10秒,当下一次又开始执行的时候,我想判断上次的程序执行完了没有,要是没有,这次就不执行了。这个我该怎么写呢? 各位帮帮忙。
谢谢了。

  回复  引用    


 

#22楼 60.176.198.* 2007-07-21 10:56 原来的我 [未注册用户]
再问一下,我看到我写的这个服务,执行的时候。会出现很多相同的进程,我想下次执行的时候,判断时候存在这个进程。要是存在就跳出了,这个该怎么判断啊? 谢谢了。
  回复  引用    


#24楼 58.19.17.* 2007-09-20 10:45 小谭 [未注册用户]

为什么我写的服务只是启动时执行一次啊!明明设置了timer的interval=200
  回复  引用    


 

#25楼 123.233.207.* 2008-08-06 17:10 陌生人 [未注册用户]
“执行命令“InstallUtil.exe MyWindowsService.exe”注册这个服务,”
这句话中怎样执行命令啊?谢谢了

  回复  引用    


 

#26楼  2008-12-23 14:35 virus      
C:\SharePoint_WF\Kimbanx.UCS.News\NewsEexpireWindowsService\bin\Debug>InstallUti
l.exe NewsEexpireWindowsService.exe
Microsoft (R) .NET Framework Installation utility Version 1.1.4322.573
Copyright (C) Microsoft Corporation 1998-2002. All rights reserved.

在初始化安装时发生异常:
System.BadImageFormatException:文件“NewsEexpireWindowsService.exe”的格式无效
。。

  回复  引用  查看    


 

#27楼 220.248.17.* 2009-01-07 16:45 xxnin [未注册用户]
很奇怪,我做了一个Windows服务来侦听UDP广播.
无论如何也收不到UDP消息.
但是我把代码使用Windows Form形式来运行就可以正常执行.
有碰到这种问题么?

  回复  引用    

 

posted on 2009-06-01 19:09  钱途无梁  阅读(1744)  评论(0编辑  收藏  举报