当前位置:  编程技术>.net/c#/asp.net

用.NET创建Windows服务的方法第1/2页

    来源: 互联网  发布时间:2014-10-13

    本文导语:  译者说明:我是通过翻译来学习C#的,文中涉及到的有Visual Studio.NET有关操作,我都根据中文版的VS.NET显示信息来处理的,可以让大家不致有误解。作者:Mark Strawmyer我们将研究如何创建一个作为Windows服务的应用程序。内容包...

译者说明:我是通过翻译来学习C#的,文中涉及到的有Visual Studio.NET有关操作,我都根据中文版的VS.NET显示信息来处理的,可以让大家不致有误解。

作者:Mark Strawmyer

我们将研究如何创建一个作为Windows服务的应用程序。内容包含什么是Windows服务,如何创建、安装和调试它们。会用到System.ServiceProcess.ServiceBase命名空间的类。


什么是Windows服务?


Windows服务应用程序是一种需要长期运行的应用程序,它对于服务器环境特别适合。它没有用户界面,并且也不会产生任何可视输出。任何用户消息都会被写进Windows事件日志。计算机启动时,服务会自动开始运行。它们不要用户一定登录才运行,它们能在包括这个系统内的任何用户环境下运行。通过服务控制管理器,Windows服务是可控的,可以终止、暂停及当需要时启动。

Windows 服务,以前的NT服务,都是被作为Windows NT操作系统的一部分引进来的。它们在Windows 9x及Windows Me下没有。你需要使用NT级别的操作系统来运行Windows服务,诸如:Windows NT、Windows 2000 Professional或Windows 2000 Server。举例而言,以Windows服务形式的产品有:Microsoft Exchange、SQL Server,还有别的如设置计算机时钟的Windows Time服务。


创建一个Windows服务

我们即将创建的这个服务除了演示什么也不做。服务被启动时会把一个条目信息登记到一个数据库当中来指明这个服务已经启动了。在服务运行期间,它会在指定的时间间隔内定期创建一个数据库项目记录。服务停止时会创建最后一条数据库记录。这个服务会自动向Windows应用程序日志当中登记下它成功启动或停止时的记录。

Visual Studio .NET能够使创建一个Windows服务变成相当简单的一件事情。启动我们的演示服务程序的说明概述如下。

1. 新建一个项目
2. 从一个可用的项目模板列表当中选择Windows服务
3. 设计器会以设计模式打开
4. 从工具箱的组件表当中拖动一个Timer对象到这个设计表面上 (注意: 要确保是从组件列表而不是从Windows窗体列表当中使用Timer)
5. 设置Timer属性,Enabled属性为False,Interval属性30000毫秒
6. 切换到代码视图页(按F7或在视图菜单当中选择代码),然后为这个服务填加功能


Windows服务的构成

在你类后面所包含的代码里,你会注意到你所创建的Windows服务扩充了System.ServiceProcess.Service类。所有以.NET方式建立的Windows服务必须扩充这个类。它会要求你的服务重载下面的方法,Visual Studio默认时包括了这些方法。

• Dispose – 清除任何受控和不受控资源(managed and unmanaged resources)
• OnStart – 控制服务启动
• OnStop – 控制服务停止

数据库表脚本样例

在这个例子中使用的数据库表是使用下面的T-SQL脚本创建的。我选择SQL Server数据库。你可以很容易修改这个例子让它在Access或任何你所选择的别的数据库下运行。

CREATE TABLE [dbo].[MyServiceLog] (
   [in_LogId] [int] IDENTITY (1, 1) NOT NULL,
   [vc_Status] [nvarchar] (40)
           COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
   [dt_Created] [datetime] NOT NULL
) ON [PRIMARY]


Windows服务样例

下面就是我命名为MyService的Windows服务的所有源代码。大多数源代码是由Visual Studio自动生成的。

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Diagnostics;
using System.ServiceProcess;

namespace CodeGuru.MyWindowsService
{
  public class MyService : System.ServiceProcess.ServiceBase
  {
   private System.Timers.Timer timer1;
   ///
   /// Required designer variable.
   ///
   private System.ComponentModel.Container components = null;

   public MyService()
   {
       // This call is required by the Windows.Forms
       // Component Designer.
     InitializeComponent();
   }

   // The main entry point for the process
   static void Main()
   {
     System.ServiceProcess.ServiceBase[] ServicesToRun;

     ServicesToRun = new System.ServiceProcess.ServiceBase[]
{ new MyService() };

     System.ServiceProcess.ServiceBase.Run(ServicesToRun);
   }

   ///
   /// Required method for Designer support - do not modify
   /// the contents of this method with the code editor.
   ///
   private void InitializeComponent()
   {
     this.timer1 = new System.Timers.Timer();
     ((System.ComponentModel.ISupportInitialize)
(this.timer1)).BeginInit();
     //
     // timer1
     //
     this.timer1.Interval = 30000;
     this.timer1.Elapsed +=
   new System.Timers.ElapsedEventHandler(this.timer1_Elapsed);
     //
     // MyService
     //
     this.ServiceName = "My Sample Service";
     ((System.ComponentModel.ISupportInitialize)
(this.timer1)).EndInit();

   }

   ///
   /// Clean up any resources being used.
   ///
   protected override void Dispose( bool disposing )
   {
     if( disposing )
     {
      if (components != null)
      {
         components.Dispose();
      }
     }
     base.Dispose( disposing );
   }

   ///
   /// Set things in motion so your service can do its work.
   ///
   protected override void OnStart(string[] args)
   {
     this.timer1.Enabled = true;
     this.LogMessage("Service Started");
   }

   ///
   /// Stop this service.
   ///
   protected override void OnStop()
   {
     this.timer1.Enabled = false;
     this.LogMessage("Service Stopped");
   }

   /*
    * Respond to the Elapsed event of the timer control
    */
   private void timer1_Elapsed(object sender,
System.Timers.ElapsedEventArgs e)
   {
     this.LogMessage("Service Running");
   }

   /*
    * Log specified message to database
    */
   private void LogMessage(string Message)
   {
     SqlConnection connection = null;
     SqlCommand command = null;
     try
     {
      connection = new SqlConnection(
"Server=localhost;Database=SampleDatabase;Integrated
Security=false;User Id=sa;Password=;");
command = new SqlCommand(
"INSERT INTO MyServiceLog (vc_Status, dt_Created)
VALUES ('" + Message + "',getdate())", connection);
      connection.Open();
      int numrows = command.ExecuteNonQuery();
     }
     catch( Exception ex )
     {
      System.Diagnostics.Debug.WriteLine(ex.Message);
     }
     finally
     {
      command.Dispose();
      connection.Dispose();
     }
   }
  }
}


    
 
 

您可能感兴趣的文章:

  • net-snmp MIB表的创建
  • asp.net 动态创建控件的演示实例
  • asp.net 3.5中在web.config文件创建ACCESS连接字符串的方法
  • 200分送上,欢迎讨论用java调用vs.net所创建的web服务!
  • WEB前端 iis7站长之家
  • c# asp .net 动态创建sql数据库表的方法
  • asp.net创建位图生成验证图片类(验证码类)
  • .NET创建、删除、复制文件夹及其子文件的实例方法
  • .NET(C#):Emit创建异常处理的方法
  • log4net创建系统日志的方法详解
  • asp.net创建母版页引来的麻烦
  • 【人才】有没有人会用VC6.0/VS2003.NET/VS2005.NET写WINDOWS下的驱动程序呀。
  • .net注册和卸载Windows服务的命令
  • 哪有windows.net 2003版下载?tell me thank
  • 有人装过windows.net server 2003吗?
  • 在单网卡的linux web服务器上虚拟Windows系统搭建多个.net web网站,有谁做过?
  • 获得.net控件的windows句柄的方法
  • 为什么我装了linux后,再用智能安装windows的方法安装winodw xp 或window.net....
  • windows server 2003 sp1下.net 3.5(Oracle 9.2)环境配置
  • 用windows客户机登陆Linux服务器不能建立建立文件夹????[img=http://forum.csdn.net/PointForum/ui/scrip
  • Win2008 R2安装.NET Framework 4的windows6.1-KB958488-V6001-x64出现灾难性故障解决方法
  • c#.NET中日志信息写入Windows日志中解决方案
  • Windows窗体的.Net框架绘图技术实现方法
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java命名空间javax.net类socketfactory的类成员方法: createsocket定义及介绍
  • asp.net post方法中参数取不出来的解决方法
  • java命名空间java.net类datagramsocket的类成员方法: disconnect定义及介绍
  • 重新注册asp.net 2.0的方法
  • java命名空间java.net类datagramsocket的类成员方法: close定义及介绍
  • .net后台获取html控件值的2种方法
  • java命名空间java.net接口cookiestore的类成员方法: get定义及介绍
  • c#.net防止按F5刷新页面重复提交的方法
  • java命名空间java.net类socket的类成员方法: isbound定义及介绍
  • asp.net 禁用viewstate(web.config中配置)的方法
  • java命名空间java.net类datagrampacket的类成员方法: getsocketaddress定义及介绍
  • iis支持asp.net4.0的注册命令使用方法
  • java命名空间java.net类multicastsocket的类成员方法: getinterface定义及介绍
  • ASP.NET使用Subtract方法获取两个日期之间的天数
  • java命名空间java.net类httpurlconnection的类成员方法: method定义及介绍
  • .net获取js中值的方法
  • java命名空间java.net枚举proxy.type的类成员方法: http定义及介绍
  • asp.net Control控件常用的属性与方法
  • java命名空间java.net类urisyntaxexception的类成员方法: getreason定义及介绍
  • c#(asp.net)接收存储过程返回值的方法
  • java命名空间java.net类datagramsocketimpl的类成员方法: getlocalport定义及介绍
  • asp.net 超时设置的方法介绍
  • java命名空间java.net类malformedurlexception的类成员方法: malformedurlexception定义及介绍
  • .NET版的ExtJS库 Ext.Net
  • java命名空间java.net类unknownserviceexception的类成员方法: unknownserviceexception定义及介绍
  • node.js的.net扩展 node.net
  • java命名空间java.net类authenticator的类成员方法: getrequestingscheme定义及介绍
  • 为什么输http://www.china-java.net,会自动改为http://www.china-java.net:8081?
  • java命名空间java.net类socketimpl的类成员方法: port定义及介绍
  • 各位之不知道net-snmp是否收费?我的产品中用到了net-snmp lib是否需要向什么单位或者组织付费?
  • java命名空间java.net类datagramsocketimpl的类成员方法: close定义及介绍


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3