1. ホーム
  2. c#

[解決済み] ローカルコンピュータのWindowsサービスの開始と停止エラー

2022-10-28 23:23:10

質問

通常、このエラーが発生します。 (ローカル コンピュータのサービス名" サービスが開始され、その後停止されました。いくつかのサービスは、他のサービスまたはプログラムによって使用されていない場合、自動的に停止します) 私のコードに何か問題がある場合、例えば存在しないドライブ パスなどがあります。Windows サービスは開始しません。

私は、サイズ制限に達した場合に、フォルダー/ファイルをある場所にバックアップする Windows サービスを持っています。詳細はすべて、Windows サービスが開始時に読み込む XML 構成によって提供されます。別のウィンドウズ・フォームに、ウィンドウズ・サービスの起動時に行うことをそのまま実行するボタンがあります。ウィンドウズサービスに入れる前にコードをデバッグするためにウィンドウズフォームを使用しています。

私のウィンドウズフォームを起動すると それは想定されたとおりのことをします。私のコードをWindowsサービスのOnStart()メソッドに入れると、エラーが表示されました。

以下は私のコードです。

protected override void OnStart(string[] args)
{

    private static string backupConfig = @"D:\LogBackupConfig\backupconfig.xml";
    private static string serviceStat = @"D:\LogBackupConfig\Status.txt";
    private static string fileFolderStat = @"D:\LogBackupConfig\FileFolderStat.txt";

    protected override void OnStart(string[] args)
    {
        if (File.Exists(backupConfig))
        {
            FileSystemWatcher watcher = new FileSystemWatcher();
            XmlTextReader reader = new XmlTextReader(backupConfig);

            XmlNodeType type;
            List<string> listFile = new List<string>();
            string fileWatch = "";

            //this loop is for reading XML elements and assigning to variables
            while (reader.Read())
            {
                type = reader.NodeType;
                if (type == XmlNodeType.Element)
                {
                    if (reader.Name == "File")
                    {
                        reader.Read();
                        fileWatch = reader.Value;
                    }
                    else if (reader.Name == "Folder")
                    {
                        reader.Read();
                        fileWatch = reader.Value;
                    }
                }
            }
            reader.Close();

            watcher.Path = fileWatch;
            watcher.Filter = "*.*";

            //this loop reads whether the service will watch a file/folder
            XmlTextReader reader1 = new XmlTextReader(backupConfig);
            while (reader1.Read())
            {
                type = reader1.NodeType;
                if (type == XmlNodeType.Element)
                {
                    if (reader1.Name == "File")
                    {
                        watcher.IncludeSubdirectories = false;
                        watcher.Changed += new FileSystemEventHandler(OnChangedFile);
                    }
                    else if (reader1.Name == "Folder")
                    {
                        watcher.IncludeSubdirectories = true;
                        watcher.Changed += new FileSystemEventHandler(OnChangedFolder);
                    }
                }
            }
            reader1.Close();

            watcher.EnableRaisingEvents = true;

        }
        else
        {
            StreamWriter sw = new StreamWriter(serviceStat, true);
            sw.WriteLine("File not found. Please start the Log Backup UI first.");
            sw.Close();
        }
    }

Windowsサービスが起動しない原因がわかりません。Windowsフォームシミュレータは問題なく動作しました。何が問題だと思われますか。

アップデイト。 多くの試行の後、フォルダ ディレクトリ (ファイルなし) のみを使用して、Windows サービスが機能しないことに気づきました。fileWatch 変数を特定のファイル (そのディレクトリを含む) に置き換えると、Windows サービスが開始されました。フォルダの場所に戻すと、動作しなくなりました。私が思うに、フォルダーの場所はファイルウォッチャーでは機能しないのです。

フォルダーの場所を監視する新しい Windows サービスを作成しようとしたとき、それは動作しました。しかし、同じ場所を元の Windows サービスで試してみたところ、それは機能しませんでした! と思いました。新しいコードや関数を配置するたびに、新しいWindowsサービスを作成してインストーラーを構築しなければならないようです。この方法で、私はどこでエラーが発生したかを追跡することができます。

どのように解決するのですか?

サービスがこのように開始と停止を繰り返す場合、あなたのコードが未処理の例外を投げていることを意味します。 これはデバッグがかなり困難ですが、いくつかのオプションがあります。

  1. Windows の イベント ビューアー . 通常は、コンピュータ/サーバー マネージャーで イベント ビューアー -> Windows ログ -> アプリケーション . ここで何が例外をスローしたかを見ることができるので、役に立つかもしれませんが、スタックトレースは得られません。
  2. プログラムロジックをライブラリクラスのプロジェクトに抽出します。 コンソールアプリ(デバッグ用)とWindowsサービスの2つのバージョンを作成します。 (これは最初の努力が少し必要ですが、長い目で見れば多くの悩みを減らすことができます)。
  3. より多くの try/catch ブロックとログをアプリに追加して、何が起こっているかをよりよく把握します。