2013-03-12 9 views
7

私はこのコードに遭遇しました:IDisposableを実装しているWindowsサービス - 悪い習慣ですか?

public class ServiceLauncher2 : ServiceBase, IDisposable 

そして、この:

 /// <summary> 
     /// Disposes the controllers 
     /// </summary> 
     // This is declared new as opposed to override because the base class has to be able to 
     // call its own Dispose(bool) method and not this one. We could just as easily name 
     // this method something different, but keeping it Dispose is just as valid. 
     public new void Dispose() 
     { 
      foreach (var mgr in _threadManagers) 
       mgr.Dispose(); 
      base.Dispose(); 
     } 

私が前にWindowsサービスの実装でこれを見たことがありません。通常、OnStop/OnStartだけがオーバーライドされます。これは悪い習慣ですか?

答えて

11

だが、これは悪い習慣であるかの方法を数えてみましょう:

  • 新しいキーワード格子である、それはコード内の潜在的な問題について黙っするようにコンパイラーに指示します。実際のところ、このクラスを使用するコードは、代わりにServiceBase.Dispose()を呼び出すことができます。 ServiceBaseは使い捨てパターンを実装していますが、正しい方法は保護されたDispose(bool)メソッドをオーバーライドすることです

  • Dispose()メソッドは、_threadManagersコレクションオブジェクトの後ろに死んだオブジェクトだけを残します。コレクションが死んだとしても後でそれを繰り返すことは無意味です。それは空にされているはずです

  • このDispose()メソッドを呼び出すことができるのはサービス終了時です。 OnStop()でそれを行うことはできません、それはまたServiceBaseを廃棄しました。ファイナライザが実行される前に "コントローラ"をマイクロ秒で処理するとプロセスが終了します。 Dispose()は、管理されていないリソースを早期に割り当て解除できるようにするためにのみ使用してください。プロセスが1ミリ秒後に停止する早い段階はありません。

このコードは意味がありません。それを使用しないでください。ただ、ハンスとポールによってすでに完璧な答えに追加する

3

非標準的ですが、it is legitと見えます。だから私は必ずしも悪い練習と呼んでいませんが、混乱を招くという事実は悪い練習になります。

これはサービスとしてのみ実行されるのですか、コンソールモードですか? (コンソールアプリケーションではOnStopが呼び出されません)、またはこのサービスプロセスを停止する他の(カスタム)方法がありますか?

の私自身の以前の質問からAmmending:new代わりのoverride、特にbase.Dispose() 以降が呼び出されている理由

私はわかりません。

理由:

'SomeClass.Dispose()':それは 、仮想抽象的、または無効とマークされていないため、継承されたメンバー 'にSystem.ComponentModel.Component.Disposeを()' 上書きすることはできません

つまり、ServiceBase.Disposeの実装はオーバーライドできません。

+0

あるComponentあるようIDisposableとして宣言ServiceLauncher2は、冗長ですコンソール経由で実行するコード(interative)ですが、展開するとサービスです。 –

+0

OK、コンソールモードでは、OnStopが呼び出されないのでDisposeメソッドをそのまま残します。 –

+0

'ServiceBase'では、プロセス全体が終了したときにデストラクタが呼び出されるため、管理されていないすべてのリソースが解放されます。インスタンス化され、複数回破壊されるライブラリクラスを扱っているわけではなく、メモリリークやリソースの枯渇の原因となります。 – ajeh

0

ServiceBaseが順番にデバッグ目的のためにそこにあるが、それは、サービスアプリケーションですでにIDisposable

関連する問題