System.Diagnostics.PerformanceData Пространство имен
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Используйте классы в этом пространстве имен для предоставления данных счетчика. Счетчики используются для предоставления метрик производительности потребителям, таким как монитор производительности. Пространство имен не содержит классов для использования данных счетчика. Полное описание архитектуры счетчиков производительности см. в разделе "Счетчики производительности".
Классы
| Имя | Описание |
|---|---|
| CounterData |
Содержит необработанные данные для счетчика. |
| CounterSet |
Определяет набор логических счетчиков. |
| CounterSetInstance |
Создает экземпляр логических счетчиков, определенных в CounterSet классе. |
| CounterSetInstanceCounterDataSet |
Содержит коллекцию значений счетчика. |
Перечисления
| Имя | Описание |
|---|---|
| CounterSetInstanceType |
Указывает, допускает ли набор счетчиков несколько экземпляров, таких как процессы и физические диски, или один экземпляр, например память. |
| CounterType |
Определяет возможные типы счетчиков. Каждому счетчику присваивается тип счетчика. Тип счетчика определяет, как вычисляются, усреднятся и отображаются данные счетчика. |
Примеры
Ниже показан простой манифест:
<!-- <?xml version="1.0" encoding="UTF-16"?> -->
<instrumentationManifest xsi:schemaLocation="http://schemas.microsoft.com/win/2004/08/events eventman.xsd"
xmlns:win="http://manifests.microsoft.com/win/2004/08/windows/events"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:trace=http://schemas.microsoft.com/win/2004/08/events/trace>
<instrumentation>
<counters xmlns=http://schemas.microsoft.com/win/2005/12/counters>
<provider
applicationIdentity = "provider1.exe"
providerType = "userMode"
providerGuid = "{51D1685C-35ED-45be-99FE-17261A4F27F3}">
<counterSet guid = "{582803C9-AACD-45e5-8C30-571141A22092}"
uri = "Microsoft.Windows.System.PerfCounters.Typing"
name = "$(string.CounterSet1.Name)"
description = "$(string.CounterSet1.Description)"
instances = "single">
<counter id = "1"
uri = "Microsoft.Windows.System.PerfCounters.Typing.TotalWords"
name = "$(string.CS1.Counter1.Name)"
description = "$(string.CS1.Counter1.Description)"
type = "perf_counter_rawcount"
detailLevel = "standard"/>
<counter id = "2"
uri = "Microsoft.Windows.System.PerfCounters.Typing.WordsInInterval"
name = "$(string.CS1.Counter2.Name)"
description = "$(string.CS1.Counter2.Description)"
type = "perf_counter_delta"
detailLevel = "standard"/>
<counter id = "3"
uri = "Microsoft.Windows.System.PerfCounters.Typing.LetterAPressed"
name = "$(string.CS1.Counter3.Name)"
description = "$(string.CS1.Counter3.Description)"
type = "perf_counter_rawcount"
detailLevel = "standard"/>
<counter id = "4"
uri = "Microsoft.Windows.System.PerfCounters.Typing.WordsContainingLetterA"
name = "$(string.CS1.Counter4.Name)"
description = "$(string.CS1.Counter4.Description)"
type = "perf_counter_rawcount"
detailLevel = "standard"/>
<counter id = "5"
uri = "Microsoft.Windows.System.PerfCounters.Typing.PercentOfWordsContainingLetterA"
name = "$(string.CS1.Counter5.Name)"
description = "$(string.CS1.Counter5.Description)"
type = "perf_sample_fraction"
baseID = "6"
detailLevel = "standard">
<counterAttributes>
<counterAttribute name = "displayAsReal" />
</counterAttributes>
</counter>
<counter id = "6"
uri = "Microsoft.Windows.System.PerfCounters.Typing.PercentBase"
type = "perf_sample_base"
detailLevel = "standard">
<counterAttributes>
<counterAttribute name = "noDisplay" />
</counterAttributes>
</counter>
</counterSet>
</provider>
</counters>
</instrumentation>
<localization>
<resources culture="en-US">
<stringTable>
<string id="CounterSet1.Name" value="Typing"/>
<string id="CounterSet1.Description" value="Captures simple typing metrics."/>
<string id="CS1.Counter1.Name" value="Total Words Typed"/>
<string id="CS1.Counter1.Description" value="The total number of words typed."/>
<string id="CS1.Counter2.Name" value="Words Typed In Interval"/>
<string id="CS1.Counter2.Description" value="The total number of words typed in the interval."/>
<string id="CS1.Counter3.Name" value="Letter A Pressed"/>
<string id="CS1.Counter3.Description" value="The number of times that the letter A is pressed."/>
<string id="CS1.Counter4.Name" value="Words Containing A"/>
<string id="CS1.Counter4.Description" value="The number of words that contain the letter A."/>
<string id="CS1.Counter5.Name" value="Percent of Words Containing A"/>
<string id="CS1.Counter5.Description" value="The percent of words that contain the letter A in the last interval."/>
</stringTable>
</resources>
</localization>
</instrumentationManifest>
Ниже показана простая реализация поставщика для манифеста:
using System.Diagnostics.PerformanceData;
private static Guid providerId = new Guid("{51D1685C-35ED-45be-99FE-17261A4F27F3}");
private static Guid typingCounterSetId = new Guid("{582803C9-AACD-45e5-8C30-571141A22092}");
private static CounterSet typingCounterSet; // Defines the counter set
private static CounterSetInstance typingCsInstance; // Instance of the counter set
private static int numberOfLetterAInWord = 0;
. . .
// Create the 'Typing' counter set.
typingCounterSet = new CounterSet(providerId, typingCounterSetId, CounterSetInstanceType.Single);
// Add the counters to the counter set definition.
typingCounterSet.AddCounter(1, CounterType.RawData32, "Total Word Count");
typingCounterSet.AddCounter(2, CounterType.Delta32, "Words Typed In Interval");
typingCounterSet.AddCounter(3, CounterType.RawData32, "A Key Pressed");
typingCounterSet.AddCounter(4, CounterType.RawData32, "Words Containing A");
typingCounterSet.AddCounter(5, CounterType.SampleFraction, "Percent of Words Containing A");
typingCounterSet.AddCounter(6, CounterType.SampleBase, "Percent Base");
// Create an instance of the counter set (contains the counter data).
typingCsInstance = typingCounterSet.CreateCounterSetInstance("Typing Instance");
typingCsInstance.Counters[1].Value = 0;
typingCsInstance.Counters[2].Value = 0;
typingCsInstance.Counters[3].Value = 0;
typingCsInstance.Counters[4].Value = 0;
typingCsInstance.Counters[5].Value = 0;
typingCsInstance.Counters[6].Value = 0;
. . .
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
typingCounterSet.Dispose();
}
// Simple effort to capture letter A key press and words typed.
private void textInput_KeyDown(object sender, KeyEventArgs e)
{
Keys keyData = e.KeyData;
switch (e.KeyData)
{
case Keys.A :
// In the .NET 3.5 Framework, you had to use the
// Value property to set and increment the counter
// value. Beginning with the .NET 4.0 Framework,
// the Value property is safe to use in a multi-
// threaded application.
typingCsInstance.Counters["A Key Pressed"].Value++;
numberOfLetterAInWord++;
break;
case Keys.Enter:
case Keys.Space:
case Keys.Tab:
if (numberOfLetterAInWord > 0)
{
// Beginning with the .NET 4.0 Framework, you
// can use the Increment method to increment
// the counter value by 1. The Increment method
// is safe to use in a multi-threaded
// application.
typingCsInstance.Counters["Words Containing A"].Increment();
typingCsInstance.Counters["Percent of Words Containing A"].Increment();
numberOfLetterAInWord = 0;
}
typingCsInstance.Counters["Percent Base"].Increment();
typingCsInstance.Counters["Total Word Count"].Increment();
typingCsInstance.Counters["Words Typed In Interval"].Increment();
break;
}
}
Комментарии
Классы в этом пространстве имен поддерживают новую архитектуру (версия 2.0) для счетчиков производительности, представленных в Windows Vista. В новой архитектуре поставщик больше не отвечает на запросы потребителей напрямую, а просто сохраняет данные счетчика. Система внедряет поток в процесс поставщика при создании экземпляра набора счетчиков; Поток отвечает за обработку запросов потребителей.
Ниже показано, как создать поставщик счетчиков.
Счетчики, которые предоставляет поставщик, определяются в манифесте на основе XML. Счетчики логически сгруппированы в наборы счетчиков. Счетчики в наборе счетчиков определяются числовым идентификатором, уникальным в наборе счетчиков. Поставщик может определить один или несколько наборов счетчиков. Набор счетчиков определяется идентификатором GUID, уникальным для поставщика. Обратите внимание, что если вы используете эти классы для записи поставщика:
Атрибут обратного вызова элемента поставщика игнорируется.
Значение ссылки для атрибута name элемента counterAttribute игнорируется.
Дополнительные сведения о написании манифеста см. в разделе "Схема счетчиков производительности".
После написания манифеста используйте средство CTRPP для компиляции манифеста (ctrpp provider.man). Средство создает четыре файла: H, C, RC и *_r.h. Вы можете игнорировать файлы H и C. Rc-файл содержит локализованные строки, определенные в манифесте. Файлы RC и *_r.h используются для создания скомпилированного файла ресурсов (RES), который вы включаете в проект. В следующем вызове показано, как скомпилировать файл ресурса:
rc /r /i "c:\Program Files\Microsoft SDKs\Windows\v6.0\Include" provider.rcЕсли возникает ошибка, которая ссылается на sal.h, скопируйте файл sal.h из Microsoft Visual Studio, Visual C включите каталог в каталог, указанный для параметра /i.
Добавьте путь к скомпилированному файлу ресурсов (RES) на страницу свойств приложения проекта.
Напишите поставщика. Ниже показаны вызовы, сделанные поставщиком:
Вызовите конструктор, CounterSet.CounterSet чтобы определить набор счетчиков. Вызовите этот метод для каждого набора счетчиков, определенного в манифесте.
Для каждого набора счетчиков вызовите один из CounterSet.AddCounter методов, чтобы добавить счетчики в набор. Вызовите этот метод для каждого счетчика, определенного в наборе счетчиков.
CounterSet.CreateCounterSetInstance Вызовите метод для создания экземпляра набора счетчиков (экземпляр содержит данные счетчика). Для наборов счетчиков одного экземпляра вызовите этот метод один раз. Для нескольких наборов счетчиков экземпляров вызовите этот метод для каждого экземпляра, для которого необходимо предоставить данные счетчика (используйте уникальное имя для каждого экземпляра).
CounterSetInstance.Counters Используйте свойство для доступа и задания данных счетчика для счетчика.
После завершения работы поставщика используйте средство LodCtr для регистрации счетчиков на компьютере. Например,
lodctr /m:provider.manВ примере предполагается, что манифест и исполняемый файл находятся в текущем каталоге.
Классы в этом пространстве имен можно использовать на компьютерах под управлением Windows Vista и более поздних операционных систем.