System.Diagnostics.PerformanceData Przestrzeń nazw
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Użyj klas w tej przestrzeni nazw, aby zapewnić dane licznika. Liczniki są używane do uwidaczniania metryk wydajności użytkownikom, takim jak monitor wydajności. Przestrzeń nazw nie zawiera klas do korzystania z danych licznika. Pełny opis architektury liczników wydajności można znaleźć w temacie Liczniki wydajności.
Klasy
CounterData |
Zawiera dane pierwotne dla licznika. |
CounterSet |
Definiuje zestaw liczników logicznych. |
CounterSetInstance |
Tworzy wystąpienie liczników logicznych zdefiniowanych w CounterSet klasie. |
CounterSetInstanceCounterDataSet |
Zawiera kolekcję wartości liczników. |
Wyliczenia
CounterSetInstanceType |
Określa, czy zestaw liczników zezwala na wiele wystąpień, takich jak procesy i dyski fizyczne, czy jedno wystąpienie, takie jak pamięć. |
CounterType |
Definiuje możliwe typy liczników. Każdy licznik ma przypisany typ licznika. Typ licznika określa sposób obliczania, średniego i wyświetlania danych licznika. |
Przykłady
Poniżej przedstawiono prosty manifest:
<!-- <?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>
Poniżej przedstawiono prostą implementację dostawcy dla manifestu:
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;
}
}
Uwagi
Klasy w tej przestrzeni nazw obsługują nową architekturę (wersja 2.0) dla liczników wydajności, które zostały wprowadzone w Windows Vista. W nowej architekturze dostawca nie odpowiada już bezpośrednio na żądania konsumentów, ale po prostu utrzymuje dane licznika. System wprowadza wątek do procesu dostawcy, gdy dostawca tworzy wystąpienie zestawu liczników; wątek jest odpowiedzialny za obsługę żądań konsumentów.
W poniższych krokach przedstawiono proces pisania dostawcy liczników.
Liczniki, które dostarcza dostawca, są definiowane w manifeście opartym na języku XML. Liczniki są logicznie grupowane w zestawy liczników. Liczniki w zestawie liczników są identyfikowane przez identyfikator liczbowy, który jest unikatowy w zestawie liczników. Dostawca może zdefiniować jeden lub więcej zestawów liczników. Zestaw liczników jest identyfikowany przez identyfikator GUID unikatowy dla dostawcy. Należy pamiętać, że jeśli używasz tych klas do pisania dostawcy:
Atrybut wywołania zwrotnego elementu dostawcy jest ignorowany.
Wartość odwołania atrybutu name elementu counterAttribute jest ignorowana.
Aby uzyskać szczegółowe informacje na temat pisania manifestu, zobacz Schemat liczników wydajności.
Po napisaniu manifestu użyj narzędzia CTRPP , aby skompilować manifest (ctrpp provider.man). Narzędzie generuje cztery pliki: .h, .c, .rc i *_r.h. Możesz zignorować pliki .h i .c. Plik RC zawiera zlokalizowane ciągi zdefiniowane w manifeście. Pliki .rc i *_r.h służą do tworzenia skompilowanego pliku zasobów (res) uwzględnionego w projekcie. Następujące wywołanie pokazuje, jak skompilować plik zasobu:
rc /r /i "c:\Program Files\Microsoft SDKs\Windows\v6.0\Include" provider.rc
Jeśli wystąpi błąd, który odwołuje się do sal.h, skopiuj plik sal.h z Microsoft Visual Studio, katalog dołączania programu Visual C do katalogu określonego dla przełącznika /i.
Dodaj ścieżkę do skompilowanego pliku zasobów (res) na stronie właściwości Aplikacji projektu.
Napisz dostawcę. W poniższych krokach pokazano wywołania wykonywane przez dostawcę:
Wywołaj konstruktor, CounterSet.CounterSet aby zdefiniować zestaw liczników. Wywołaj tę metodę dla każdego zestawu liczników zdefiniowanego w manifeście.
Dla każdego zestawu liczników wywołaj jedną z CounterSet.AddCounter metod, aby dodać liczniki do zestawu. Wywołaj tę metodę dla każdego licznika zdefiniowanego w zestawie liczników.
Wywołaj metodę CounterSet.CreateCounterSetInstance , aby utworzyć wystąpienie zestawu liczników (wystąpienie zawiera dane licznika). W przypadku zestawów liczników pojedynczego wystąpienia wywołaj tę metodę jednorazowo. W przypadku wielu zestawów liczników wystąpień wywołaj tę metodę dla każdego wystąpienia, dla którego należy podać dane licznika (użyj unikatowej nazwy dla każdego wystąpienia).
CounterSetInstance.Counters Użyj właściwości , aby uzyskać dostęp do licznika i ustawić dane licznika.
Po zakończeniu korzystania z dostawcy użyj narzędzia LodCtr , aby zarejestrować liczniki na komputerze. Na przykład
lodctr /m:provider.man
W przykładzie przyjęto założenie, że plik manifestu i pliku wykonywalnego znajdują się w bieżącym katalogu.
Można użyć klas w tej przestrzeni nazw na komputerach z systemem Windows Vista i nowszych systemów operacyjnych.