【问题标题】:Sending a email on a specfic time interval in windows service在 Windows 服务中以特定时间间隔发送电子邮件
【发布时间】:2012-06-15 18:32:05
【问题描述】:

我正在使用 Visual Studio 2010 和 Database Sql Server 2010。

我创建了一个窗口服务,它必须在时间间隔发生时发送电子邮件 (EMAIL_SENT_TIME)

我的数据库包含这些列

    Tracker_Id bigint 
,EMAIL_SENT_TIME bigint --this contains interval in which the email must be fired 1800,3600,7200 etc, 
    Last_check datetime --the previous check datetime,
    next_check datetime --the next check datetime

假设表包含此日期 tracker_Id | EMAIL_SENT_TIME |最后检查 |下一个检查
100097 1800 日期时间 nextdatetime
100098 3600 日期时间 nextdatetime
100099 7200 日期时间 nextdatetime
100100 1800 日期时间 nextdatetime

1800 表示 30 分钟, 3600 表示 1 小时等。

我想在 30 分钟后发送电子邮件,那些 EMAIL_SENT_TIME 是 1800 等等。

如何解决这个问题....

【问题讨论】:

  • 为什么投反对票告诉我,这样我就不会再犯错了
  • 你看过Quartz.NET?

标签: c# visual-studio-2010 windows-services window


【解决方案1】:

每个记录的 EMAIL_SENT_TIME 列是否可以更改或者它是一个常量?在间隔上做某事的最简单方法之一是 System.Threading.Timer 类。第一个参数是回调函数(在这种情况下,每次间隔过去时发送一封电子邮件),然后是状态数据(这可能包含您要插入到每封电子邮件中的信息,偏移时间,最后一个是间隔。这个如果您的数据库 EMA​​IL_SENT_TIME 值发生更改,该类还允许您在 Timer 运行时更改间隔。

Timer timer = new Timer((x) => SendEmail(), null, 0, EMAIL_SENT_TIME * 1000).

在 SendEmail() 函数中,您可以在 Last_Check 时间列中记录当前的 DateTime.Now。您实际上并不需要 Next_Check,因为您始终可以添加最后一次检查加上间隔来获得该值。

System.Threading.Timer

【讨论】:

  • EMAIL_SENT_TIME 是常数。计时器间隔定义为 30 分钟,即 1800000 毫秒
  • 在这种情况下 System.Threading.Timer 将是一个很好的解决方案。不过请注意,请确保 Timer 对象是类的成员,而不是本地对象,否则它可以被垃圾收集并且不会触发。如果它是您的服务类别的成员,那么它将在您的服务期间保持活动状态。
  • 你的说法是为每个场景的创建一个线程计时器。即 1800 的线程计时器对象,3600 的线程计时器对象。我是对的,或者我错过了一些东西
  • 是的,根据这篇 SO 帖子,您可以同时拥有数千个计时器,stackoverflow.com/questions/2375034/…。因此,您可以将 List 作为服务的成员,然后在您的 Service OnStart() 事件中,循环访问您的数据库条目并生成每个将其添加到列表中的计时器。
猜你喜欢
  • 1970-01-01
  • 2015-12-05
  • 2013-09-17
  • 1970-01-01
  • 2015-04-29
  • 2016-12-28
  • 2015-11-19
  • 2019-01-08
  • 2013-10-15
相关资源
最近更新 更多