4

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

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

我需要 Windows 服务做的就是使用计时器并每 5 分钟调用一次课程,但我不知道发生了什么,因为我什至无法测试我的 Windows 服务。

请有人告诉我要做什么来测试,如果有办法测试,或者只是眨眼运气并祈祷它有效,哈哈。

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

这是我的 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");
                }
            }
        }
        }


    }
4

5 回答 5

3

你当然可以测试它。所有你需要的是

  1. 启动服务
  2. 观察它在 5 分钟后触发了预期的呼叫
  3. (请注意,它每 5 分钟触发一次预期的呼叫,持续几次)

您可以手动测试它,或者(最好)创建/使用自动化测试工具,它允许您重复可靠地测试,只要您想要多次。即使使用简单的批处理文件也可以做到这一点。

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

为了使其更具可测试性,您也可以从服务类中提取计时逻辑,以便它可以从常规应用程序中运行。然后您可以更轻松地对其进行测试,甚至使用 NUnit 之类的单元测试框架。这使您可以使用不同的时间间隔等进行更彻底的测试。服务类本身几乎变成了一个空壳,其唯一的工作就是启动和调用其他类。如果您已经验证包含真实程序逻辑的所有类(即所有可能失败的代码)都经过单元测试并且工作正常,那么您可以更有信心地相信您的整个应用程序,当从其较小的部分集成时,也可以正常工作.

更新

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

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

scheduleTimer1.Interval = 1 * 60 * 1000;
于 2012-05-08T07:17:28.427 回答
3

James Michael Hare 在他的博客上写了关于他制作的一个非常好的模板/框架,使开发(和调试)Windows 服务变得更加容易:C# 工具箱:可调试、自安装的 Windows 服务模板 (1 of 2)

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

我自己用过几次,真的可以推荐它。

于 2012-05-08T07:23:47.847 回答
1

在另一个类中重构你的逻辑。

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

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

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

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

于 2012-05-08T07:20:24.697 回答
0

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

System.Diagnostics.Debugger.Break();

或者

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

或者

3.使用日志文件记录您的服务在做什么。

于 2012-05-08T07:19:46.240 回答
0

您可以将调试器附加到从 Visual Studio 运行的服务实例。单击主菜单中的“调试”,“附加到进程...”,从列表中选择您的服务进程,然后单击“附加”。

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

于 2012-05-08T07:26:30.263 回答