【问题标题】:Console app timer to call web methods every x minutes控制台应用计时器每 x 分钟调用一次 Web 方法
【发布时间】:2010-12-22 20:48:36
【问题描述】:

我在 VB.Net,VS 2008 中编码。 我编写了一个控制台应用程序,它使用来自网站应用程序的 2 个 Web 方法。我需要增强此控制台应用程序,以便它连续启动 Web 方法,可能每 x 分钟(在营业时间内),但绝不会在最后一次调用终止之前,其持续时间可能会有所不同,具体取决于要处理的帐户数量。

最初,我使用任务计划程序安排应用程序,但我认为这不会阻止同时进行两次调用。

虽然我看过很多关于使用计时器的帖子,但我还没有找到我真正需要的东西。

到目前为止,我有:

Dim aTimer As New System.Timers.Timer()
    AddHandler aTimer.Elapsed, AddressOf TriggerWebMethods

' Set the Interval to 10 minutes:
aTimer.Interval = 1000 * 60 * 10            '(1 second * 60 = 1 minute * 10 = 10 minutes)
aTimer.Enabled = True
aTimer.AutoReset = True
  1. 什么时候应该使用Timer.ElapsedTimer.Tick
  2. Timer.EnabledTimer.Start 之间有什么区别,我应该只选择一个吗?
  3. 我希望在第一个网络方法完成后启动第二个网络方法。

我想让这个尽可能简单。谢谢大家的帮助。

【问题讨论】:

  • 你的 TriggerWebMethods() 方法是什么样的?
  • 整个过程相当复杂:数据从一台服务器上的数据库传输到另一台服务器上的数据库,经过加密,然后异步传输到目标服务器,并在那里解密。新数据将全天可供传输。因此 TriggerWebMethods 包含对每个 Web 引用的调用,然后将时间记录到事件日志中。
  • System.Timers.Timer 有一个 Elapsed-Event 并且 System.Windows.Forms.Timer 有一个 Tick-Event。查看此链接以了解差异:go4expert.com/forums/showthread.php?t=2122
  • 您为什么不将其作为 Windows 服务执行?
  • @Conrad:没有理由重新使用 Windows 服务。昨天我开始研究这个时才第一次听说 Windows 服务,所以我对它们了解不多。

标签: vb.net timer console


【解决方案1】:

如果您正在处理System.Timers.Timer,那么您将只有Elapsed 事件可用。如果是System.Windows.Forms.Timer,那么您将使用Tick 事件。您不是在编写 WinForms 应用程序,因此您将使用 System.Timers.Timer

就个人而言,我只会使用Enabled 属性来查看计时器是否已启动。我不会用它来启动或停止它。使用Start()Stop() 方法可以非常清楚地知道计时器发生了什么。

如果您的 Web 方法同步执行,您可以在 TriggerWebMethods() 方法中一个接一个地调用它们。在第一个完成之前,第二个不会被调用。

Sub TriggerWebMethods(source As Object, e As ElapsedEventArgs)
    FirstWebMethod()
    SecondWebMethod()
End Sub

如果是异步的,您必须在第一个 Web 方法上注册一个回调,以便在第二个 Web 方法完成时执行它。在VB中,我相信你可以直接使用第二个作为回调,这取决于你如何进行异步调用。 (抱歉,我的 VB 现在很生锈,所以可能不是 100% 正确的语法)

Sub FirstWebMethod()
    ' ...
End Sub

Sub SecondWebMethod()
    ' ...
End Sub

Sub TriggerWebMethods(source As Object, e As ElapsedEventArgs)
    Dim first As Action = AddressOf FirstWebMethod
    first.BeginInvoke(AddressOf SecondWebMethod, first)
End Sub

【讨论】:

  • 谢谢,杰夫!什么是回调?如果在这里解释太复杂,您可以提供链接吗?我目前拥有的代码似乎根本没有调用 web 方法。我在 TriggerWebMethods 上有一个断点,但执行没有到达那里。
  • @Developer:回调只是异步调用完成时要调用的一些方法。在您的情况下,当第一个方法调用完成时,您想调用第二个。
  • 所有:我需要更多帮助。据我所知,我的网络方法没有被调用。我从 VS 启动了 Web 应用程序,并且在第一个 Web 方法的入口点上建立了一个断点。我启动控制台应用程序(也从 IDE 启动)并观察它执行几行代码,然后显然停止。你们还有几分钟时间帮忙吗?谢谢。
  • @Developer:您能否更新您的问题以包括您如何调用您的网络方法并标记您所说的停止位置?我们需要更多信息。
  • +1 不错的答案。本来会早点做的,但我没有选票(愚蠢的选民徽章和 25% 的问题要求。)
【解决方案2】:

只是为 Jeff M 的回答添加一点内容。 Timer.Elapsed Event 有以下注释。

如果 SynchronizingObject 属性为 null,则 Elapsed 事件为 在 ThreadPool 线程上引发。如果 Elapsed 事件持续的处理 长于间隔,事件可能 在另一个 ThreadPool 上再次引发 线。在这种情况下,事件 处理程序应该是可重入的

由于您在控制台应用程序中,您可以手动滚动您自己的 SynchronizingObject,也可以将 AutoReset 设置为 False,然后将 TriggerWebMethods 更改为在结尾处开始。您甚至可能希望抵消时间间隔以考虑处理时间。

例如

    Dim start As Date = Now


    'do stuff


    Dim ts As TimeSpan = Now - start

    Dim i As Integer = (1000 * 60 * 10) - ts.TotalMilliseconds

    Dim aTimer As Timers
    aTimer.Interval = i

【讨论】:

  • 康拉德和杰夫,感谢您抽出宝贵时间回复。但我似乎在倒退。我现在根本无法触发 Web 方法调用。我见过一些示例,其中有人在实例化 Timer 时编写了 WithEvents。这两种方法有什么区别?
  • 查看 stackoverflow.com/q/2208775/119477 的 WithEvents 位。不知道为什么您的事件没有被触发。你的 AddHandler 是什么样的?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-23
相关资源
最近更新 更多