2009-07-29 4 views
2

У меня есть служба Windows с использованием таймера, который не идеален для того, что я хочу сделать. У меня есть метод, который я хочу позвонить, и как только его финиш, я хочу, чтобы он начинался снова и снова и снова. Каков наилучший способ сделать это, и вы можете показать мне пример.Windows Service looping - Как?

+0

Я не могу помочь, но любопытно, что именно вы хотите сделать снова и снова, навсегда. – quillbreaker

+0

Мы опросили клиентскую систему, чтобы импортировать задания, которые должны быть прямой ссылкой, они не будут толкать их, мы должны их получить, и нам нужно импортировать их в течение 10 секунд создаваемого файла там системы – MartGriff

+0

Есть ли постоянное соединение к этому месту? Если это так, FileSystemWatcher можно использовать ... но только если соединение открыто, и вы можете получить доступ к диску через UNC. – Hooloovoo

ответ

1

Можете ли вы объяснить немного больше того, что вы пытаетесь достичь.

При использовании таймера в Сервисе вам необходимо использовать System.Threading.Timer.

Если вы постоянно зацикливаете, то ваше использование процессора будет проходить через крышу. Если вы пытаетесь контролировать каталог, вы можете использовать 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-го/3-го раза до того, как 1-й будет завершен. но мне нужно, чтобы время опроса было как можно меньше, например. 2-е, вот почему я спрашиваю о цикле. – MartGriff

+0

Итак, вам нужно реализовать логическое значение, чтобы узнать, выполняется ли его текущий запуск, и если его текущий запуск не выполняет повторную выполнение функции/кода. В основном то же, что и выше. Вы можете изменить код, чтобы он срабатывал каждые 2 секунды, если вам нравится, добавляя больше или предложение к функции OnTimeEvent. – Zman101

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

Может ли это вызвать проблему на стеке? если работает 24/7 – MartGriff