我在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
Timer.Elapsed
与Timer.Tick
?Timer.Enabled
与Timer.Start
之间有什么区别?我应该只选择一个吗?我想尽量保持这一点。谢谢你的帮助。
答案 0 :(得分:1)
如果您正在处理System.Timers.Timer
,那么您只能获得Elapsed
个活动。如果是System.Windows.Forms.Timer
,那么您将使用Tick
事件。您没有编写WinForms应用程序,因此您将使用System.Timers.Timer
。
就个人而言,我只会使用Enabled
属性来查看计时器是否已启动。我不会用它来启动或停止它。使用Start()
或Stop()
方法可以清楚地了解计时器发生了什么。
如果您的网络方法同步执行,您可以在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
答案 1 :(得分:0)
只是为Jeff M的答案补充一点。 Timer.Elapsed Event有以下注释。
如果SynchronizingObject属性为null,则Elapsed事件为 在ThreadPool线程上引发。如果 处理经过的事件持续 事件可能比间隔更长 在另一个ThreadPool上再次被提升 线。在这种情况下,事件 处理程序应可重入。
由于您处于控制台应用程序中,您可以手动滚动自己的SynchronizingObject,也可以将AutoReset
设置为False
,并将TriggerWebMethods更改为最后开始。您甚至可能希望偏移间隔以考虑处理时间。
e.g。
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