Цикл службы Windows - Как? - PullRequest
2 голосов
/ 29 июля 2009

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

Ответы [ 2 ]

3 голосов
/ 29 июля 2009
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();
1 голос
/ 29 июля 2009

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

При использовании таймера в Сервисе вам необходимо использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...