gpt4 book ai didi

c# - 我如何知道我的 Windows 服务是否正常工作?

转载 作者:太空狗 更新时间:2023-10-30 00:55:09 26 4
gpt4 key购买 nike

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


}

最佳答案

当然你可以测试它。你只需要

  1. 启动服务
  2. 观察它在 5 分钟后触发了预期的调用
  3. (观察它每 5 分钟触发一次预期的调用,再触发几次)

您可以手动对此进行测试,或者(最好)创建/使用自动化测试工具,它允许您重复和可靠地进行测试,次数不限。这甚至可以使用一个简单的批处理文件。

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

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

更新

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

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

scheduleTimer1.Interval = 1 * 60 * 1000;

关于c# - 我如何知道我的 Windows 服务是否正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10494197/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com