1

ここでマークされた回答の指示に従って、サービスを作成しました。サービスが正しくインストールされます。しばらくしてサービスを開始すると、「Windows はローカル コンピューターで xxx サービスを開始できませんでした。

エラー 1053: サービスは開始要求または制御要求にタイムリーに応答しませんでした。"

[OK] をクリックすると、そのステータスは「開始中」のままになります。アプリケーションとシステムのログを確認したところ、エラーはありませんでした。

SQL トレースを確認すると、サービスは実際に正しく実行されており、本来の動作を行っています。では、なぜそのステータスは「開始中」のままなのでしょうか?

更新: これは OnStart メソッドのコードです

 protected override void OnStart(string[] args)
        {

            Loader loader = new Loader();
            loader.StartProcess();
        }

更新 2:

WiktorZychla のコメントに基づいて、私はこれを実行しましたが、うまくいきました:)

protected override void OnStart(string[] args)
        {

            Loader loader = new Loader();

            ThreadStart threadDelegate = new ThreadStart(loader.StartProcess);
            Thread newThread = new Thread(threadDelegate);
            newThread.Start();

        }
4

3 に答える 3

6

WiktorZychlaのコメントに基づいて、これは私がしたことです

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using IndexLoader;
using System.Threading;

namespace myNameSpace
{
    public partial class LoaderService : ServiceBase
    {
        Thread newThread;
        public LoaderService()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {

            Loader loader = new Loader();

            ThreadStart threadDelegate = new ThreadStart(loader.StartProcess);
            newThread = new Thread(threadDelegate);
            newThread.Start();

        }

        protected override void OnStop()
        {
            if ((newThread != null) && (newThread.IsAlive))
            {


                Thread.Sleep(5000);
                newThread.Abort();

            }
        }
    }
}
于 2012-05-29T21:13:34.713 に答える
5

OnStart()メソッドに何が含まれているかを正確に知ることは有益です。このOnStart()メソッドは、サービスの開始に使用されるOSからのコールバックですが、 30秒以内に戻る必要があります(どこかで読んだことを覚えています)。それ以外の場合、OSは表示されているメッセージを表示します。つまり、メソッドを初期化するように制限し、OnStart()サービスが実行する実際の作業をある種のスレッドに延期します。

于 2012-05-26T17:29:56.853 に答える
1

関数内の Program.cs ファイルで、次のMain()ことを確認してください。

ServiceBase.Run(new ServiceClassHere());

キープのWindowsフォームアプリを作成するとき、私は何度も罪悪感を抱いてきました

Application.Run(new Class());私のMain()機能で

于 2012-05-25T20:08:42.700 に答える