2

私はWindowsサービス(実際にはそれらのいくつか)をインストールしています、そしてこれはそれらの1つのスニペットです:

<Component Id="cmpD9168A36C32F8D411B6EF4270EE6544F" Guid="{E5811AB8-0949-4C75-99BD-6687EB4672D4}" Win64="yes">
          <File Id="filD9168A36C32F8D411B6EF4270EE6544F" KeyPath="yes" Source="$(var.LoggerService.ProjectDir)\bin\LoggerService.exe" />
          <ServiceInstall
              Id="loggerServiceInstaller"
              Type="ownProcess"
              Vital="yes"
              Name="$(var.Manufacturer)LoggerService"
              DisplayName="$(var.Manufacturer)LoggerService"
              Start="auto"
              Account="[PROP_DOMAINUSER]"
              Password="[PROP_PASSWORD]"
              ErrorControl="ignore"
              Interactive="no">
            <ServiceDependency Id="LanmanWorkstation"/>
            <ServiceDependency Id="LanmanServer"/>
          </ServiceInstall>
          <ServiceControl Id="loggerStartService" Start="install"  Stop="both" Remove="uninstall" Name="$(var.Manufacturer)LoggerService" Wait="yes" />
        </Component>

これで、インストール中にサービスが開始しようとしますが、設計上失敗する可能性があり、問題ありません。しかし今、サービスが失敗すると、キャンセルするか再試行するかを尋ねられます。どうすれば失敗を無視できますか?

4

1 に答える 1

4

通常、これはサービスの設計に問題があります。たとえば、StackOverflow に関する質問に回答しました。開発者は、起動時にサービスが Web サービスを呼び出し、MSI が起動に許可する 30 秒よりも時間がかかると言っています。私の答えはいつも「本当に??」です。

それは悪いデザインです。サービスの OnStart() は、バックグラウンド ワーカー スレッドをスピンアップして成功を報告する以外は何もしない必要があります。そのスレッドは、作業を初期化して処理する必要があります。OnStart のパイプラインは、最小限の依存関係と最小限の実行時間を持つ必要があります。

于 2013-02-13T13:27:23.063 に答える