0

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

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

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

Onstart メソッドでは、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 が中止されます。

4

2 に答える 2

0

主な問題は、問題が何であるかを見つけることでした。コードのさまざまな部分にコメントを付けたり、コメントを外したりして、実際の問題を発見しました.OnStartthreadはプロセスを起動します(1つのexeを開始します).私がしたことは、プロセスを開始した後、OnStartthread を 1 秒間スリープさせたことです。(より適切なのは、プロセスを開始し、さまざまなイベントをキャッチしてプロセスのステータスを把握し、準備ができたら移動することです)それは魔法のように機能しました。これはどういうわけか私が直面していた問題を修正します。

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

    //the code is in OnStartThread 

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

于 2012-04-20T17:58:49.773 に答える
0

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

更新:デバッガーがプロセスに接続されていない場合は、この方法で行うことができます

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

System.Threading.Timer30秒ごとにポーリングを行うために使用しないのはなぜですか?

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
}
于 2012-04-16T09:29:38.400 に答える