我已经建立了一个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");
                }
            }
        }
        }


    }

最佳答案

你当然可以试试。你只需要
启动服务
观察5分钟后触发预期呼叫
(注意,它每隔5分钟触发一次预期的呼叫,持续几次)
您可以手动测试,或者(最好)创建/使用一个自动化测试工具,它允许您重复和可靠地测试,可以根据需要多次。即使使用简单的批处理文件,这也是可能的。
要检测计时器是否正常工作,可以检查其日志文件。当然,如果您使被调用的类方法可配置,而不是硬编码,那么它也会有帮助。所以你可以使用一个不会淹没你收件箱的虚拟工作类来运行你的自动化测试:-)
为了使它更易于测试,您还可以从服务类中提取时序逻辑,以便它可以从常规应用程序中运行。然后您可以更容易地测试它,甚至可以使用单元测试框架(如nunit)。这允许您使用不同的时间间隔等进行更彻底的测试,并且服务类本身变成了一个几乎为空的shell,其唯一的工作是启动和调用其他类。如果您已经验证了所有包含真实程序逻辑的类(即所有可能失败的代码)都经过了单元测试并且工作正常,那么您就可以对整个应用程序(从较小的部分集成)也能正常工作有更大的信心。
更新
通过查看代码,似乎没有在任何地方初始化flag,因此其默认值将为false。您应该在构造函数中将其初始化为true,否则即使计时器正常启动,您的电子邮件检索器也不会被调用。
把时间间隔设为1分钟,我的第一个猜测是

scheduleTimer1.Interval = 1 * 60 * 1000;

10-07 12:04
查看更多