2009-08-05 11 views
2

Visual Studio .NET 2008 with VB.NETで2つのサービスが開発されました。両方とも、別々の個人(自分自身の1人)が完全に別々に開発しましたが、どちらもブート中に同じエラーを報告しています。起動後にシステムイベントログに「サービスがハングアップしました」と表示されます。サービスは、そのメッセージの後にうまく始まるように進んでいます(サービスが開始されたという通知が表示されます)。 .NETフレームワークやJITを読み込むのが遅いということが、これを引き起こしているコードをコンパイルしているのでしょうか?手動で終了すると、起動して停止します。 Mineは、フレームワークが提供するもの以外のスタートアップコードを持たない非常にシンプルなサービスです。Windowsサービスが起動中に起動します

アップデート1: これは私がOnStartメソッドで持っているすべてである:それはちょうどVB.NETで提供されるデフォルトの空のpublicコンストラクタを取得するよう

host = New ServiceHost(GetType(FSE.Licensing.FSELicense)) 
    host.Open() 

FSELicenseは、コンストラクタを定義していない、私は推測。

更新2: 私の質問は、おそらく問題を修正した同僚が提案した解決策に基づいて変わっています。このソリューションは実際には、要求が行われるまでサービスが何もしないので、必要とは思わなかった別のサービスに依存関係を追加するだけです。ただし、COMタイプの変数を宣言します。このCOMタイプへの参照を持つと(たとえインスタンスが存在しなくても)COM DLLがサービスと同時にロードされ、おそらくサービスに依存する可能性がありますか?私はCOMリファレンスが.NETの静的リンクのようなものであることを認識しませんでした。

+0

スタートアップコードはまったくありません。イベントを待ち受けるクラスをインスタンス化しないでください。スタートアップ時に何もしないと、このサービスは正確に何をしますか? – David

+0

はい、イベントをリスンするクラスをインスタンス化しますが、フレームワークコードとしてカウントしました:)実際はそうではないと思います。 – BlueMonkMN

+0

host.Open()は何をしますか? 一般に、OnStartメソッドでは作業を実行しないでください。 OnStartメソッドが適時に返るように、実際の作業を行うためにスレッドを開始する必要があります。 –

答えて

4

「HTTP SSLサービス」(HTTPFilter)のサービスにサービスの依存関係を追加することで、私の問題を解決しました。私は、.NETで書かれたWindowsサービスを持つXPマシンで全く同じ問題を抱えていました。ネットピップとhttpバインディングを持つWCFエンドポイントを公開しました。システムが起動すると、常にhost.Open()呼び出しでハングアップし、最終的にタイムアウトになります。私は問題なく手動でサービスを開始することができました。

adding a service dependencyの手順については、このリンクを参照してください。私が使用しDependOnService値はHTTPFilter

+0

IPSECサービス(PolicyAgent)にサービス依存関係を追加することでこの問題を解決しました –

+0

他のサービスへの依存関係をランダムに追加するのは脆弱なソリューションです。 – oefe

+0

私たちのソリューションはランダムではありませんが、私はoefeに同意します。彼らは科学的に効果があることが証明されました。 (私は、HTTPFilterの依存関係をテストして2時間かけて結果が繰り返し得られることを確認しました)。私たちのソリューションの問題は、なぜ彼らが問題を軽減したのか理解できないことです。 –

0

これは推測ですが、システムの起動時に、非常に多くのものがシーンの後ろに読み込まれているため、これはすでに遅くなります。

また、起動する他のサービスに依存するコンポーネントについても心配する必要があります。たとえば、サービスがSQL Serverデータベースエンジンサービスに依存するSQL Serverエージェントに依存している場合、依存関係の順に読み込まれるまで待つ必要があります。

そう... FSE.Licensing.FSELicenseが内部で、それが最初にロードするために依存する他のサービスのために待っているかもしれない、またはそれだけでマシンが遅いと何ができるかに応じて、

、およびすべてのバックグラウンドプロセスのロードは同時に行われ、サービスはすべてのプロセスでリソースと競合しています。

しかし、私には警告が表示されているだけです。私はロードするためにしばらく時間がかかる可能性がある私のサービスのいくつかでこれを見てきました。これは明らかで、私はたぶんそれを言う必要はないかもしれませんが、サービスコントロールマネージャーはサービスが特定の時間内にロードされることを期待しています(私はそれが何であるかはわかりませんが)その間、サービスはまだロードしようとしています。あなたのサービスが開始されている限り、私はこの警告についてあまり心配しないでしょう。

サービスコンソールで確認できることは、サービスのプロパティを見て、[依存関係]タブを見てください。それは空白かもしれませんが、それはあなたにいくつかの洞察を与えるかもしれません。

+0

この問題は、膨らんだことのない新しい高速システムを含むほとんどのシステムで発生します。また、.NETベースのサービスだけがこれらのエラーを報告しています。私たちはこれまでのところ警告であることを認めましたが、複数の顧客がこれらについて質問しており、今は回答を求められています。サービスは依存関係がなく、私が言ったように、それは非常に単純なサービスです。 VB.NETサービスを他の人が作成していて、この問題がないのですか? – BlueMonkMN

+0

申し訳ありません。私は自分のサービスの1つでこの問題を抱えています。私はこの状況に非常に簡単なサービスで遭遇することはありません。申し訳ありませんが、私はもっと助けになることはできませんでした。 – David

2

OnStartでの処理を最小限に抑えるようにしてくださいました。特に、未知の時間のブロックを回避する。例えばリモートコンピュータに接続しようとしないでください。データベースクエリやサービス要求はありません。

ブロックするか、そうでなければ時間がかかるものを行う必要がある場合は、可能であれば、このタスクのために別のスレッドを生成してください。

しかし、OnStartから返されたときにサービスが動作可能であることを確認する必要があるため、完全にブロックすることを避けることはできません。そのような場合は、ServiceBase.RequestAdditionalTimeを使用して、OnStartが終了するまでの時間をもうけることができます。

1

HTTPFilterに依存関係を追加すると、私たちの問題が解決することがあります。いくつかのWindows Server 2008システムでこの回避策を使用しました。このHTTPFilterサービスは、一部のWindows 7 Professional 64bitシステムにはインストールされていないようですが、実際にはwcfサービスホストが起動しない(依存関係が見つかりません)という問題が発生します。

関連する問題