2

サーバーのいくつかの設定を監視するための Windows サービスを構築しました。かなりの数の WinForm および WPF アプリを開発しましたが、Windows サービスに関してはまったくの初心者です。そのため、msdn に頼ってチュートリアルに従いました簡単なサービスの作り方。これで、サービスを問題なくインストールして実行できるようになりましたが、Microsoft チュートリアルからいくつかの断片を切り取った場合のみ.

いくつかのテストの後、SetServiceStatus() の onstart メソッドでサービスがクラッシュするようです。

public partial class MyService: ServiceBase
{
    private static ManualResetEvent pause = new ManualResetEvent(false);

    [DllImport("ADVAPI32.DLL", EntryPoint = "SetServiceStatus")]
    public static extern bool SetServiceStatus(IntPtr hServiceStatus, SERVICE_STATUS lpServiceStatus);
    private SERVICE_STATUS myServiceStatus;

    private Thread workerThread = null;
    public MyService()
    {
        InitializeComponent();
        CanPauseAndContinue = true;
        CanHandleSessionChangeEvent = true;
        ServiceName = "MyService";
    }
    static void Main()
    {
        // Load the service into memory.
        System.ServiceProcess.ServiceBase.Run(MyService());
    }

    protected override void OnStart(string[] args)
    {
        IntPtr handle = this.ServiceHandle;
        myServiceStatus.currentState = (int)State.SERVICE_START_PENDING;
        **SetServiceStatus(handle, myServiceStatus);**
        // Start a separate thread that does the actual work.
        if ((workerThread == null) || ((workerThread.ThreadState & (System.Threading.ThreadState.Unstarted | System.Threading.ThreadState.Stopped)) != 0))
        {
            workerThread = new Thread(new ThreadStart(ServiceWorkerMethod));
            workerThread.Start();
        }
        myServiceStatus.currentState = (int)State.SERVICE_RUNNING;
        SetServiceStatus(handle, myServiceStatus);
    }
 }

行をコメントアウトすると、サービスが正常に実行されるようになりましたSetServiceStatus()。なぜこれが失敗するのですか?これは権利の問題ですか、それともここでのポイントを完全に見逃していますか?

4

1 に答える 1

4

SetServiceStatus通常、フレームワークを使用してマネージド サービスを実装する場合は、呼び出す必要はありません。

そうは言っても、それを呼び出す場合は、使用する前に完全に初期化する必要があります。SERVICE_STATUS現在、状態のみを設定していますが、他の変数は設定していません

これは、次のベスト プラクティスで提案されていSetServiceStatusますSERVICE_STATUS

于 2013-02-27T17:58:12.237 に答える