私はこれによって完全に困惑しています(TM):Win7SP1では、64ビットマシンは、PerfMon
インストールされたカスタムパフォーマンスカウンターの知識を完全に否定しているように見えます。実稼働マシンにカウンターを完全にインストールしている既存のコードベースを使用していますが、自分のマシンで実行する場合、追加したカウンターを使用して実行する場合、または完全に工夫されたアセンブリを実行する場合(下に肉を貼り付けます)、ひどく変な振る舞いをします。
次のコードスニペットを使用して説明するのがおそらく最も簡単です。
var category = "SuperTest";
var counterName = "Test Counter 1";
var shouldInstall = true;
if (PerformanceCounterCategory.Exists(category))
{
shouldInstall = false;
Console.WriteLine("{0} Category Exists. Overwrite? [n]", category);
var input = Console.ReadLine();
if (bool.TryParse(input, out shouldInstall))
{
PerformanceCounterCategory.Delete(category);
}
}
if (shouldInstall)
{
var col = new CounterCreationDataCollection();
col.Add(new CounterCreationData()
{
CounterName = counterName,
CounterType = PerformanceCounterType.NumberOfItems64
});
PerformanceCounterCategory.Create(category, "Test category.", PerformanceCounterCategoryType.SingleInstance, col);
// Magical voodoo line that may indicate my inexperience, but whose inclusion or
// exclusion does not affect discernibly affect behavior.
PerformanceCounter.CloseSharedResources();
}
// Multithreading setup, each thread repeats block below infinitely:
{
System.Threading.Thread.Sleep((new Random()).Next(100));
try
{
var counter = new PerformanceCounter(category, counterName, false));
c.Increment();
}
catch (Exception ex) { /* ... */ }
}
初めて実行するときは、カテゴリは存在せず、カテゴリとカウンターの作成が続行されます。プロセスを強制終了してから、を開きPerfMon
ます。この時点でAdd Counter
、カテゴリとカウンターを確認し、完全にうまく追加して、に座っているのを見ることができ0.000
ます。完全。この時点で、閉じPerfMon
てから再度開くとどうなりますか?すべてのシステムパフォーマンスカウンターは問題なく表示されますが、前述のように、本番環境で機能するもの、それらに基づいて作成したもの、および考案されたものはすべてなくなっています。
興味深いのは、上記のコードを実行すると、グループが存在することを一貫して教えてくれることです。深く潜ると、カウンターも存在します。これは私には奇妙に思えます。それを消えた状態のままにして、ここから手がかりをとって、私は走ることができます:lodctr /R
、そして彼らは戻ってきます。
だから、どういうわけか私は自分のパフォーマンスカウンターストアを壊しているようです。私の質問には2つの部分があります。
- これは私がしていることですか(パフォーマンスカウンターストアを破壊しています)?
- 再現性があるので、この動作を作成するために行っているコードまたはプロセスで目立つものはありますか?
私の考えでは、これは他の「パフォーマンスカウンターがなくなった」という質問とは多少異なります。なぜなら、それらは存在し、消えていくのを見ているからです。