我怎么知道我的Windows服务是否正常工作?

时间:2012-05-08 07:10:59

标签: c# unit-testing testing windows-services timer

我已经构建了一个Windows服务,每隔5分钟使用我的电子邮件收件箱填充数据库。

我在我的Windows服务中使用了一个类,该类获取我的电子邮件并将它们写入我的数据库,该类已经过测试和工作。

所有我需要的Windows服务是使用计时器并每5分钟调用一次,但我不知道最新情况,因为我甚至无法测试我的Windows服务。

请有人打电话告诉我该做什么来测试,如果有办法测试,或只是眨眼运气并祈祷它有效lol。

每次要测试服务时还是必须卸载并重新安装,还是有更新服务选项? 请回答这个我真的很感兴趣,即使这不是我的主要问题。

这是我的Windows服务,如果你可以指出任何错误,这将是惊人的,因为我无法测试它们。我认为我的计时器可能是错的,如果有人可以看一下呢?

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Timers;

namespace EmailWindowsService
{
    public partial class MyEmailService : ServiceBase
    {
        private Timer scheduleTimer1 = null;
        private DateTime lastRun;
        private bool flag;

        public MyEmailService()
        {
            InitializeComponent();
            if (!System.Diagnostics.EventLog.SourceExists("MySource"))
            {
                System.Diagnostics.EventLog.CreateEventSource(
                    "MySource", "MyNewLog");
            }
            eventLogEmail.Source = "MySource";
            eventLogEmail.Log = "MyNewLog";

            scheduleTimer1 = new Timer();
            scheduleTimer1.Interval = 5 * 60 * 1000;
            scheduleTimer1.Elapsed += new ElapsedEventHandler(scheduleTimer_Elapsed);
        }

        protected override void OnStart(string[] args)
        {
            flag = true;
            lastRun = DateTime.Now;
            scheduleTimer.Start();
            eventLogEmail.WriteEntry("Started");
        }

        protected override void OnStop()
        {
            scheduleTimer.Stop();
            eventLogEmail.WriteEntry("Stopped");
        }
        protected override void OnPause()
        {
            scheduleTimer.Stop();
            eventLogEmail.WriteEntry("Paused");
        }
        protected override void OnContinue()
        {
            scheduleTimer.Start(); ;
            eventLogEmail.WriteEntry("Continuing");
        }
        protected override void OnShutdown()
        {
            scheduleTimer.Stop();
            eventLogEmail.WriteEntry("ShutDowned");
        }

        protected void scheduleTimer_Elapsed(object sender, ElapsedEventArgs e)
        {
            RetriveEmailClass Emails = new RetriveEmailClass();
            if (flag == true)
            {

                eventLogEmail.WriteEntry("In getting Email Method");
                Emails.ServiceEmailMethod();
                lastRun = DateTime.Now;
                flag = false;
            }
            else if (flag == false)
            {
                if (lastRun.Date < DateTime.Now.Date)
                {
                    Emails.ServiceEmailMethod();
                    eventLogEmail.WriteEntry("In getting Email Method");
                }
            }
        }
        }


    }

5 个答案:

答案 0 :(得分:3)

詹姆斯·迈克尔·哈尔(James Michael Hare)在blog撰写了关于他所做的非常好的模板/框架的文章,使开发(和调试)Windows服务变得更加容易:C# Toolbox: A Debuggable, Self-Installing Windows Service Template (1 of 2)

它为您提供快速入门所需的所有基础知识。最重要的是,它为您提供了一种非常好的方式来调试您的服务,就像它是一个常规的控制台应用程序一样。我还可以提一下,它提供了开箱即用的功能来安装(和卸载)您的服务。可以找到帖子的第二部分at this link

我自己曾经使用过几次,并且可以推荐它。

答案 1 :(得分:2)

当然你可以测试一下。你所需要的只是

  1. 启动服务
  2. 观察它在5分钟后触发预期的通话
  3. (观察它会每5分钟触发一次预期的呼叫多次)
  4. 您可以手动测试,或者(最好)创建/使用自动测试工具,这样您可以根据需要反复可靠地进行测试。即使使用简单的批处理文件也可以这样做。

    要检测计时器是否正常工作,您可以检查其日志文件。当然,如果您使被调用的类方法可配置而不是对其进行硬编码,这也会有所帮助。因此,您可以使用虚拟工作程序类运行自动化测试,该工作类不会使您的收件箱泛滥: - )

    为了使其更加可测试,您也可以从服务类中提取时序逻辑,以便它可以从常规应用程序运行。然后,即使使用单元测试框架(如NUnit),您也可以更轻松地进行测试。这允许您使用不同的时间间隔等进行更全面的测试。服务类本身变成一个几乎为空的shell,其唯一的工作是启动并调用其他类。如果您已经验证所有包含真实程序逻辑的类(即所有可能失败的代码)都经过单元测试并且工作正常,您可以更加自信地认为整个应用程序在从较小的部分进行集成时也能正常工作

    更新

    仔细查看代码,您似乎没有在任何地方初始化flag,因此其默认值为false。您应该在构造函数中将其初始化为true,否则即使计时器正常启动,也不会调用您的电子邮件检索器。

    要将间隔设置为1分钟,我的第一个猜测是

    scheduleTimer1.Interval = 1 * 60 * 1000;
    

答案 2 :(得分:1)

在另一个类中重构逻辑。

编写一个调用此类的简单控制台应用程序

像普通应用程序一样进行测试。

一旦它独立运行,它应该作为服务运行。 注意权限和服务注册,有一些问题(如拥有sys用户或桌面会话)。

一个好的做法是使用系统日志(例如您可以使用eventvwr检查的日志)

答案 3 :(得分:0)

1.将此行添加到您要中断的位置,然后您可以调试您的服务。

System.Diagnostics.Debugger.Break();

2.从流程资源管理器中附加到您的服务进度,然后您也可以调试您的服务。

3.使用日志文件记录您的服务正在执行的操作。

答案 4 :(得分:0)

您可以将调试器附加到从Visual Studio运行服务实例。点击&#34;调试&#34;在主菜单中,&#34;附加到流程...&#34;,从列表中选择您的服务流程,然后点击&#34;附加&#34;。

如果您需要调试服务的启动,则需要使用System.Diagnostics.Debugger.Break()