2009-07-29 6 views
2

私は何をしたいのか理想的ではないタイマーを使ってWindowsサービスをビルドしました。私は呼ぶべきメトードを持っています。そして、それが何度も何度も何度も始まりたいと思っています。これを行う最善の方法は何ですか?私に例を示すことができますか?Windowsサービスルーピング - どのように?

+0

私は助けるが、あなたが永遠に、何度も何度もやりたいれるもの好奇心旺盛にすることはできません。 – quillbreaker

+0

ライブリンクである必要があるジョブをインポートするためにクライアントシステムをポーリングし、取得する必要があります。システムに作成されるファイルの10秒以内にインポートする必要があります。 – MartGriff

+0

永続的な接続はありますかこの場所に?その場合、FileSystemWatcherは使用可能ですが、接続が開いていてUNC経由でドライブにアクセスできる場合のみです。 – Hooloovoo

答えて

1

達成しようとしていることをもう少し説明できますか?

サービスでタイマーを使用する場合は、System.Threading.Timerを使用する必要があります。

あなたが常にループしているなら、あなたのCPU使用量は屋根を通過するでしょう。ディレクトリを監視しようとするとFileSystemWatcherを使うことができますが、ホストコンピュータがWindowsを実行していない場合は面倒です。テーブルを照会して結果を取得しようとすると、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回目の起動です。しかし、私は可能な限り低いポーリング時間が必要です。 2秒間これは私がループについて尋ねる理由です。 – MartGriff

+0

したがって、現在実行されているか、現在実行中のものが関数/コードを再実行しないかを知るには、ブール値を実装する必要があります。基本的には上記と同じです。 OnTimeEvent関数にmoreまたはclauseを追加することで、必要に応じて2秒ごとに起動するようにコードを変更することができます。 – 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時間365日稼働している場合 – MartGriff

関連する問題