2012-04-16 16 views
0

私はC#のWindowsサービスを持っています。私はそれを停止しようとすると停止状態になり、私はonStopメソッドにブレークポイントを置いたとき、それはヒットしていません。問題をデバッグすることはできません。私はサービス全体の例外処理と未処理の例外処理を追加しましたが、エラーは発生しません。すべてのことは、それがcanStop trueに設定されservieでうまく、また、RequestAdditionalTime()を使用しています。C#ウィンドウサービスOnStopが呼び出されない

また、app.configでlegacyUnhandledExceptionPolicy enabled = "true"を設定しました。しかし、助けのない。 サービスコントロールマネージャがOnStopメソッドを呼び出さないようにするスレッド/リソースの問題のようです。または、サービスが既に破損した状態になっている可能性があり、サービス制御マネージャーがサービスを停止できません。それは、状態を停止から停止に変えるだけです。

サービスをexeにコードを添付してデバッグしようとすると、サービスを停止しようとしても何も起こりません。 onstopメソッドが呼び出されていません。

In Startメソッドは、30秒ごとに一種のポーリングを継続するスレッドを開始します。 onStopメソッドが呼び出されたとしたら、このスレッドを中止します。これがこのサービスがどのように開発されたかです。 誰かがこの問題をデバッグする方法についてアドバイスをいただけますか?

いくつかのスレッドの問題がある場合、またはOnStartメソッドのスレッドがサービスコントロールマネージャに利用可能なリソースを固定している場合、デバッグに使用できるツールがありますか? 緊急のことを親切に助けてください。

OnStopメソッド内のコード:

try 
{ 
    RequestAdditionalTime(10*60*1000); 
    IntPtr handle = this.ServiceHandle; 
    KServiceStatus.currentState = (int) State.SERVICE_START_PENDING; 
    SetServiceStatus(handle, ref KServiceStatus); 

    RequestAdditionalTime(30000); 

    if ((onStartThread == null) || 
     ((onStartThread.ThreadState & 
      (ThreadState.Unstarted | ThreadState.Stopped)) != 0)) 
    { 
     onStartThread = new Thread(new ThreadStart(KWindowsServiceHandler.OnStart)); 
     onStartThread.Start(); 
    } 

    KServiceStatus.currentState = (int) State.SERVICE_RUNNING; 
    SetServiceStatus(handle, ref KServiceStatus); 
}    

OnStartThreadは、サービスが実行されるまで実行されているになります。ポーリングをする必要がありました。 onStopメソッドがコール(呼び出されていない)の場合、このOnStartThreadをアボートします。

おかげで、

カマル

+1

サービススレッドにはどこにThread.Join()が含まれていますか?他の回避可能なハードロックブロッキング待っている?もしそうなら、それを遠ざける。 –

+0

とThread.IsBackgroundは、例外的なクリーンアップが絶対的に必要なものを除くすべての非メインワークスレッドに対してtrueに設定されます。 OnStartメソッドの –

+0

私はthread.joinを呼び出すことができません。 onStartThreadは30秒ごとにポーリングするために必要です。だから私の唯一の選択肢は、サービスが停止しているときにOnStartThreadを中止することです。 –

答えて

0

主な問題は、問題が何かを見つけることでした。だから、コメントとコードの別の部分のコメントを解除し、実際の問題を発見した.OnStartthreadプロセスを起動する(これは1つのexe)ので、私のWindowsサービスでこのコードを保持し、すべてを削除し、私は問題を再現することができた私がやったことは、プロセスを開始してからOnStartthreadを1秒間スリープさせることです。 (より適切なのは、プロセスを開始し、プロセスの状況を知るためにさまざまなイベントをキャッチすることで、それがただ動く準備ができているとき)、それは魔法のように機能しました。 これは何とか私が直面していた問題を解決します。

このスリープが存在しなかった場合、プロセスが開始されますが、プロセス(exe)が開始されたためにOnStopメソッドのブレークポイントに到達できませんでしたが、完全に開始して一貫性があり、 thread.sleep完全に起動するために必要なリソースをexeに渡します。

//the code is in OnStartThread 

someProcess.start(); Thread.Sleep(1000);

0

は、あなたが実行を中断したいポイント、でDebugger.Break();を使用してみてください。またはメニューDebug > Attach to processでWindowsサービスプロセスに接続し、Visual Studioでブレークポイントを設定します。

UPDATE:デバッガがプロセスに接続されていない場合、あなたはこのよう

if (!Debugger.IsAttached) 
    Debugger.Launch(); 

はなぜポーリングに各30秒を行うためにSystem.Threading.Timerを使用しないことを行うことができますか?

protected override void OnStart(string[] args) 
{ 
    const int period = 30 * 1000; 
    Timer timer = new Timer(TimerCallback, null, 0, period); 
} 

private void TimerCallback(object state) 
{ 
    // Polling goes here 
} 
+0

私はこの処理をOnStartメソッドの処理に付加しましたが、サービスを停止するとOnStopメソッドは呼び出されません。ブレークポイントは無効のままです –

関連する問題