2009-06-22 32 views
0

私はwcf webserviceにpingを実行するだけで、夜間に同じWebサービスにメンテナンス要求を送信するvb.net Windowsサービスを構築しました。タイマーイベントを使用して両方のタスクを実行します。起動時にサービスがアイドル状態の原因をシャットダウンしているという2つのこと以外は何もしない場合。 Windowsのサービススレッドは何かtodoが必要です。Windowsサービスがアイドル状態でシャットダウンする

マシンのリソースを浪費することなくこのシャットダウンを防ぐ最良の方法は何ですか? または、アイドルチェックを無効にするためにAPIの設定を忘れましたか?

Protected Overrides Sub OnStart(ByVal args() As String) 
    Dim keepAliveTimer As New System.Timers.Timer(3600000) 
    AddHandler keepAliveTimer.Elapsed, AddressOf IsWebserviceAliveHandler 
    keepAliveTimer.AutoReset = True 
    keepAliveTimer.Start() 
    Dim interval As Integer = Me.CalculateInterval(8, 25) 
    Dim timer As New System.Timers.Timer(interval) 
    AddHandler timer.Elapsed, AddressOf SendDailyMaintenanceRequestHandler 
    timer.AutoReset = True 
    timer.Start() 
End Sub 
+0

あなたの 'OnStart()'メソッドはどのように見えますか? –

+0

保護オーバーライドサブのOnStart(文字列としてByVal引数())新規でSystem.Timers.Timer(3600000)として 暗いkeepAliveTimerのAddHandler keepAliveTimer.Elapsed、のAddressOf IsWebserviceAliveHandler keepAliveTimer.AutoReset =真 keepAliveTimer.Start() 薄暗い間隔として整数= Me.CalculateInterval(8、25) 新でSystem.Timers.Timerとして暗いタイマー(インターバル) AddHandlerのtimer.Elapsed、のAddressOf SendDailyMaintenanceRequestHandler timer.AutoReset = Trueの timer.Start() End Subの –

+0

それは次のようになりますsendDailyMaintenanceRequestHandler(または少なくともその構造体)のコードを見てみると面白い –

答えて

0

OnStartサービスが停止するまでループする新しいスレッドを作成します。タスクを実行してから一定時間待機します。そうすれば、サービスは止まらないでしょう。

while (!serviceStopped) 
{ 
    try 
    { 
     PerformTask(); 
     Thread.Sleep(24 * 60 * 60000); // Wait 24 hours 
    } 
    catch (ThreadAbortException) 
    { 
     break; 
    } 
    catch 
    { 
     // Log errors 
    } 
} 
+0

私はこれを試しました..しかし、私のperformtaskはあまりにも速い..それは完全に開始された状態に入るために、サービススターターが忙しいスレッドを必要とするようです。スタートアップ時に眠れば、サービスのスタートアップをスリープさせるようです。しばらくするとタイムアウトになるので、サービスは起動していないと表示されますが、Windowsプロセス自体は実行に成功しました。 より良い解決策が必要です。 –

+0

さて、スレッドはビジーです - それは眠っています。明確にする:これはOnStartのコードではありません! OnStartでは、上記のコードを含むスレッドメソッドを使用して新しいスレッドを作成します。 –

1

これはうまく機能サービスで作業を行うタイマーを有するべきである:

次スレッドメソッドの擬似コードであろう。私は昨年のプロジェクトで一種の "ハートビートサービス"を実装しました。原因(それはそれが停止した場合には、Webアプリケーションの開始を持っているために定期的にWebサーバに要求を行い、我々の場合には

// assumes that you have using System.Threading; in the top of the file 
private Timer _heartbeatTimer; 

protected override void OnStart(string[] args) 
{ 
    // the GetTimerInterval function returns an int with the interval (picked 
    // up from config file 
    _heartbeatTimer = new Timer(HearbeatTimerHandler, null, new TimeSpan(0), 
           new TimeSpan(0, GetTimerInterval(), 0)); 
} 


private static void HearbeatTimerHandler(object state) 
{ 
    try 
    { 
     // do the work 
    } 
    catch (Exception ex) 
    { 
     // log the exception 
    } 
} 

:ここではそれがどのように見えるから(ややダウン剥奪)コードサンプルですリサイクルなどに)。

+0

私はまったく同じことをしました。あなたのように2つのタイマーを起動しました。しかし、私の場合、サービスの起動時に、スターターは「サービスがシャットダウンされました。 –

+0

例外が発生する可能性があることを確認しましたか? –

関連する問題