La maggior parte dei contatori delle prestazioni di istanze multiple in Windows sembrano automaticamente (?) Avere un n al fine se c'è più di un'istanza con lo stesso nome.Denominazione dei contatori delle prestazioni a più istanze in .NET
Per esempio: se, in Perfmon, si guarda sotto la categoria Process
, vedrete:
...
dwm
explorer
explorer#1
...
Ho due explorer.exe
processi, in modo che il secondo contatore ha # 1 aggiunto al suo nome.
Quando tento di fare questo in un'applicazione .NET:
- posso creare la categoria, e registrare l'istanza (utilizzando il
PerformanceCounterCategory.Create
che prende unCounterCreationDataCollection
). - Posso aprire il contatore per scrivere e scrivere su di esso.
Quando apro il contatore una seconda volta (in un altro processo), apre lo stesso contatore. Ciò significa che ho due processi in lotta per i contatori.
Il documentation for PerformanceCounter.InstanceName
indica che #
non è consentito nel nome.
Quindi: come si ottengono contatori di prestazioni a istanze multiple che sono in realtà più istanze? E dove le seconde (e successive) istanze ottengono #n
aggiunte al nome?
Ovvero: so che posso inserire l'ID del processo (ad es.) Sul nome dell'istanza. Funziona, ma ha lo sfortunato effetto collaterale che il riavvio del processo genera un nuovo PID e Perfmon continua a monitorare il vecchio contatore.
Aggiornamento:
Sto creando la categoria (e contro) come segue:
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);
}
sto aprendo il contatore come segue:
PerformanceCounter counter = new PerformanceCounter(
categoryName, counterName, instanceName, readOnly: false);
Quando si apre il contatore delle prestazioni per la seconda volta, lo stai facendo in un processo diverso o da un altro componente nello stesso processo? – JMarsch
Processo diverso. –
Penso che devi aprirli con nomi di istanze differenti. Altrimenti finirai per scrivere sul contatore sbagliato. Inoltre, vedere http://msdn.microsoft.com/en-us/library/dd537616.aspx che sembra suggerire che il "# 1" sia stato aggiunto da perfmon. – feroze