2009-07-29 67 views
2

我已经建立一个Windows服务使用一个计时器,这是不是我想要做的理想。我有一个方法,我想打电话,一旦它结束,我希望它一次又一次地开始。这样做的最好方法是什么,你可以给我一个例子。Windows服务循环 - 如何?

+0

我不禁好奇什么是你想要做一遍又一遍,直到永远。 – quillbreaker 2009-07-29 15:42:12

+0

我们调查客户端系统以导入需要成为活动链接的作业,他们不会推送它们,我们必须去获取它们,并且我们需要在系统上创建的文件的10秒内导入它们 – MartGriff 2009-07-29 15:50:56

+0

是否存在永久连接到这个位置?如果是这样,一个FileSystemWatcher是可用的...但只有当连接打开,你可以通过UNC访问驱动器。 – Hooloovoo 2009-07-29 15:53:57

回答

1

你能解释一下你想完成什么吗?

在Service中使用计时器时,您需要使用System.Threading.Timer。

如果你经常循环,那么你的CPU使用率将会通过屋顶。如果您尝试监视某个目录,则可以使用FileSystemWatcher,但如果您的主机未运行Windows,这可能会很麻烦。如果你试图查询一个表并得到结果,你可以每隔15秒查看一条新记录,并且如果存在新记录,则将该函数标记为通过布尔值运行,以便如果它在15秒后仍然运行,则不会再次启动。

我打算给你一个系统服务中定时器的例子。

Private myThreadingTimer As System.Threading.Timer 
    Private blnCurrentlyRunning As Boolean = False 

    Protected Overrides Sub OnStart(ByVal args() As String) 
     Dim myTimerCallback As New TimerCallback(AddressOf OnTimedEvent) 
     myThreadingTimer = New System.Threading.Timer(myTimerCallback, Nothing, 1000, 1000) 
    End Sub 

    Private Sub OnTimedEvent(ByVal state As Object) 
     If Date.Now.Second = 1 Or Date.Now.Second = 15 Or Date.Now.Second = 30 Or Date.Now.Second = 45 Then 
      If Not blnCurrentlyRunning Then 
       blnCurrentlyRunning = True 

       Dim myNewThread As New Thread(New ThreadStart(AddressOf MyFunctionIWantToCall)) 
       myNewThread.Start() 
      End If 
     End If 
    End Sub 

Public Sub MyFunctionIWantToCall() 
    Try 
     'Do Something 
    Catch ex As Exception 
    Finally 
     blnCurrentlyRunning = False 
    End Try 
End Sub 
+0

我的计时器问题是在第一次找到之前的第二次/第三次启动。但我需要轮询时间尽可能低,例如2秒这就是为什么我问循环。 – MartGriff 2009-07-29 15:53:54

+0

所以你需要实现一个布尔值来知道它当前是否正在运行,以及它当前正在运行的是否不重新执行函数/代码。基本上和上面一样。您可以修改代码,使其每2秒触发一次,如果您愿意,可以在OnTimeEvent函数中添加更多或子句。 – Zman101 2009-07-29 16:16:11

3
private AutoResetEvent m_waitNextExec = new AutoResetEvent(false); 
private int m_execTimer = 1000; //Every second 
private bool m_isRunning = true; 

private void SomeMethod() 
{ 
    while (m_isRunning) 
    { 
     //Do something 

     m_waitNextExec.WaitOne(m_execTimer); 
    } 
} 

此代码使您对代码的执行更多的控制。自动重置事件为您提供了降低执行率的可能性。

如果你想中止执行,你只需要做:

m_isRunning = false; 
m_waitNextExec.Set(); 
+0

这会导致堆栈出现问题吗?如果全天候运行 – MartGriff 2009-07-29 16:08:21