0

自動的に開始され、ステータスが「開始済み」になるWindowsサービスを作成しました。サービスの状態が「開始」状態になり、システムを再起動しても「開始」状態に戻らないことがあります。コード内の未処理の例外が原因で発生している可能性があります。

public partial class EngineHostService : ServiceBase
{
    internal static ServiceHost _serviceHost = null;

    public EngineHostService()
    {
        InitializeComponent();
    }

    protected override void OnStart(string[] args)
    {
        try
        {
            if (_serviceHost != null)
                _serviceHost.Close();

            _serviceHost = new ServiceHost(typeof(EngineService.Engine));
            _serviceHost.Open();
        }
        catch (Exception ex)
        {
            ErrorHandler.LogEvent(ex.Message);
        }
    }

    protected override void OnStop()
    {
        if (_serviceHost != null)
        {
            _serviceHost.Close();
            _serviceHost = null;
        }
    }

}

上記のコードでは、Engine クラスのコンストラクターが実行されると、いくつかの例外がスローされます。サービスを停止したい: 1- 何らかの例外がスローされた場合。2-コンストラクター内で呼び出した関数がfalseを返す場合。必要に応じてサービスを停止する方法はありますか。そうする場合、サービスのステータスが「開始済み」または「停止済み」のいずれかになるはずです。何らかの方法を提案します。

4

3 に答える 3

0

個別の懸念。OnStart からできるだけ早く戻る必要があるため、OnStart メソッドで非同期 TPL タスクを開始し、それ以上何もしないことをお勧めします。

非同期タスクでは、やりたいことが何でもできます。

これを行うことで、サービスは OnStart を完了し、Starting から Started に適切に移行できます。

于 2013-02-25T08:18:55.827 に答える
0

どちらかInitializeComponentがあまりにも多くの仕事をしている、またはそれがスタートアップEngineService.Engineで多くのことをしているように思えます。率直に言って、起動時に直接行うことはほとんどありません。構成を検証してから、実際の作業のためにワーカー スレッド (またはいくつか) を開始するだけです。

于 2013-02-25T08:08:59.600 に答える