У Вас есть несколько опций. Перечисленный в порядке предпочтения:
SortedMap
: SortedMap myNewMap = new TreeMap(myOldMap);
SortedSet keys = new TreeSet(myMap.keySet());
List keys = new ArrayList(myMap.keySet());
Collections.sort(keys);
последние два получат Вас, что Вы хотите, но должны только использоваться, если Вы только хотите выполнить итерации однажды и затем забыть все это.
Необходимы дальнейшие действия. Похоже, в любом случае, под Win7 монитор производительности может работать не так, как ожидалось. Когда я написал тестовый код, я приостановил приложение после создания счетчиков, чтобы запустить монитор производительности. Как только я позволил ему продолжить, монитор никогда не менял свои счетчики, несмотря на то, что был изменен базовый счетчик.
Если я затем выйду из монитора производительности и перезапущу его, будет показано последнее значение счетчика в тестовой программе, указывающее, что он был установлен правильно. Если бы я затем снова запустил тестовую программу, просто изменив значения, монитор производительности, наконец, уловил бы изменения.
Итак, код, как все указали, правильный, это был монитор производительности Windows, который плохо себя вел.
Спасибо всем за ответы!
Возможно ли, что в ходе тестирования вы изменили имя счетчика? Ваш код не проверяет, что категория содержит ваш счетчик - он только проверяет, существует ли категория, и если да, то не создает категорию.
Если вы изменили имена счетчиков с момента первого создания категории, ваш новый счетчик не будет существовать в категории, и вы можете упустить небольшое различие в названии счетчика при просмотре его в Performance Monitor.
Ваш код выглядит хорошо. Единственное отличие от моего рабочего примера в том, что я вызываю метод приращения после установки RawValue.
PerformanceCounter myCounter =
new PerformanceCounter(counterCategory, counterName, false);
for (int i = 0; i < 10; i++)
{
Console.WriteLine("Setting to "+i);
myCounter.Increment();
Thread.Sleep(200);
}
myCounter.Close();