4

現在、私は次のような方法を持っています:

    private bool IsMyServiceRunning(string serviceName)
    {
        if (String.IsNullOrEmpty(serviceName))
            throw new InvalidOperationException("ServiceName cannot be null or empty");

        using (var service = new ServiceController(serviceName))
        {
            if (service.Status == ServiceControllerStatus.Running)
                return true;
            else
                return false;
        }
    }

これは ServiceController クラスを使用する正しい方法ですか?

私が尋ねた理由は、私が見たすべての例は、使用が終わったときにClose()メソッドを呼び出していないからです。それらは悪い例ですか、それとも何か不足していますか?

4

4 に答える 4

7

-ステートメントを使用しServiceControllerていusingます。これDisposeは、Close() を明示的に呼び出すのと同じ ServiceController で呼び出されます。

したがって、あなたの場合、Close を再度呼び出す必要はありません。

using ステートメントがない場合は、ServiceController で Close() または Dispose() を呼び出す必要があります。これは、解放する必要があるアンマネージド リソースを使用するためです。そうしないと、メモリリークが発生します。

ServiceController service = null;

try {
  service = new ServiceController(serviceName);

  if (service.Status == ServiceControllerStatus.Running) {
    return true;
  }
  else {
    return false;
  }
}
finally{
  if (service != null) {
    service.Close(); // or service.Dispose();
  }
}
于 2013-03-01T13:20:59.870 に答える
4

あなたの例は、オブジェクトをクリーンアップするServiceControllerを呼び出す using ステートメントでラップします。Disposeを呼び出すのと同じCloseです。

于 2013-03-01T13:22:07.223 に答える
3

Close()usingここではシンタックス シュガーが使用されているため、呼び出されていません。

using (var resource = new Resource())
{
}

次と同等です。

{
    var resource = new Resource();
    try
    {
    }
    finally
    {
        if (resource != null)
        {
            resource.Dispose();
        }
    }
}

Dispose()リソースをクリーンアップするための自動呼び出し。

詳細については、このブログ投稿を参照してください。

于 2013-03-01T13:23:19.213 に答える
0

close()メソッドを何度も使用しましたが、 dispose()を再度使用することはできません。Dispose() はデータベース内の接続を使用しています...

于 2013-03-01T13:23:32.787 に答える