【发布时间】:2011-02-28 18:24:12
【问题描述】:
如果有多个同名实例,Windows 中的大多数多实例性能计数器似乎会自动(?)在末尾添加一个 #n。
例如:如果在 Perfmon 中查看 Process 类别,您会看到:
...
dwm
explorer
explorer#1
...
我有两个explorer.exe 进程,所以第二个计数器的名称后面附加了#1。
当我尝试在 .NET 应用程序中执行此操作时:
- 我可以创建类别并注册实例(使用带有
CounterCreationDataCollection的PerformanceCounterCategory.Create)。 - 我可以打开计数器进行写入和写入。
当我第二次(在另一个进程中)打开计数器时,它会打开同一个计数器。这意味着我有两个进程在柜台竞争。
documentation for PerformanceCounter.InstanceName 声明名称中不允许使用#。
那么:我如何拥有实际上是多个实例的多实例性能计数器?第二个(和后续的)实例在哪里获得 #n 附加到名称?
也就是说:我知道我可以将进程 ID(例如)放在实例名称上。这可行,但有一个不幸的副作用,即重新启动进程会导致新的 PID,并且 Perfmon 会继续监视旧计数器。
更新:
我正在按如下方式创建类别(和计数器):
const string categoryName = "Test App";
const string counterName = "Number of kittens";
string instanceName =
Path.GetFileNameWithoutExtension(
Process.GetCurrentProcess().MainModule.FileName);
if (!PerformanceCounterCategory.Exists(categoryName))
{
var counterCreationDataCollection = new CounterCreationDataCollection
{
new CounterCreationData(counterName, "",
PerformanceCounterType.NumberOfItems32)
};
PerformanceCounterCategory.Create(categoryName, "",
PerformanceCounterCategoryType.MultiInstance,
counterCreationDataCollection);
}
我打开柜台如下:
PerformanceCounter counter = new PerformanceCounter(
categoryName, counterName, instanceName, readOnly: false);
【问题讨论】:
-
当您第二次打开性能计数器时,您是在不同的进程中执行的,还是从同一进程中的不同组件执行的?
-
我认为您必须使用不同的实例名称打开它们。否则你最终会写错柜台。另外,请参阅msdn.microsoft.com/en-us/library/dd537616.aspx,这似乎表明 perfmon 正在添加“#1”。