PerformanceCounter.NextValue Метод
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Получает образец счетчика и возвращает расчетное значение для него.
public:
float NextValue();
public float NextValue ();
member this.NextValue : unit -> single
Public Function NextValue () As Single
Возвращаемое значение
Следующее расчетное значение, получаемое системой для этого счетчика.
Исключения
Экземпляр класса, неправильно связанный со счетчиком производительности.
Произошла ошибка при обращении к API-интерфейсу системы.
Код, выполняющийся без привилегий администратора, предпринял попытку считывания значения счетчика производительности.
Примеры
В следующем примере кода создается ElapsedTime счетчик и используется NextValue метод для отображения значений счетчика за период времени.
#using <System.dll>
using namespace System;
using namespace System::Collections;
using namespace System::Collections::Specialized;
using namespace System::Diagnostics;
using namespace System::Runtime::InteropServices;
void OutputSample( CounterSample s )
{
Console::WriteLine( "\r\n+++++++++++" );
Console::WriteLine( "Sample values - \r\n" );
Console::WriteLine( " BaseValue = {0}", s.BaseValue );
Console::WriteLine( " CounterFrequency = {0}", s.CounterFrequency );
Console::WriteLine( " CounterTimeStamp = {0}", s.CounterTimeStamp );
Console::WriteLine( " CounterType = {0}", s.CounterType );
Console::WriteLine( " RawValue = {0}", s.RawValue );
Console::WriteLine( " SystemFrequency = {0}", s.SystemFrequency );
Console::WriteLine( " TimeStamp = {0}", s.TimeStamp );
Console::WriteLine( " TimeStamp100nSec = {0}", s.TimeStamp100nSec );
Console::WriteLine( "++++++++++++++++++++++" );
}
void CollectSamples()
{
String^ categoryName = "ElapsedTimeSampleCategory";
String^ counterName = "ElapsedTimeSample";
// Create the performance counter category.
if ( !PerformanceCounterCategory::Exists( categoryName ) )
{
CounterCreationDataCollection^ CCDC = gcnew CounterCreationDataCollection;
// Add the counter.
CounterCreationData^ ETimeData = gcnew CounterCreationData;
ETimeData->CounterType = PerformanceCounterType::ElapsedTime;
ETimeData->CounterName = counterName;
CCDC->Add( ETimeData );
// Create the category.
PerformanceCounterCategory::Create( categoryName,
"Demonstrates ElapsedTime performance counter usage.",
CCDC );
}
else
{
Console::WriteLine( "Category exists - {0}", categoryName );
}
// Create the performance counter.
PerformanceCounter^ PC = gcnew PerformanceCounter( categoryName,
counterName,
false );
// Initialize the counter.
PC->RawValue = Stopwatch::GetTimestamp();
DateTime Start = DateTime::Now;
// Loop for the samples.
for ( int j = 0; j < 100; j++ )
{
// Output the values.
if ( (j % 10) == 9 )
{
Console::WriteLine( "NextValue() = {0}", PC->NextValue() );
Console::WriteLine( "Actual elapsed time = {0}", DateTime::Now.Subtract( Start ) );
OutputSample( PC->NextSample() );
}
// Reset the counter on every 20th iteration.
if ( j % 20 == 0 )
{
PC->RawValue = Stopwatch::GetTimestamp();
Start = DateTime::Now;
}
System::Threading::Thread::Sleep( 50 );
}
Console::WriteLine( "Elapsed time = {0}", DateTime::Now.Subtract( Start ) );
}
int main()
{
CollectSamples();
}
using System;
using System.Collections;
using System.Collections.Specialized;
using System.Diagnostics;
using System.Runtime.InteropServices;
public class App
{
public static void Main()
{
CollectSamples();
}
public static void CollectSamples()
{
const String categoryName = "ElapsedTimeSampleCategory";
const String counterName = "ElapsedTimeSample";
// If the category does not exist, create the category and exit.
// Performance counters should not be created and immediately used.
// There is a latency time to enable the counters, they should be created
// prior to executing the application that uses the counters.
// Execute this sample a second time to use the category.
if ( !PerformanceCounterCategory.Exists(categoryName) )
{
CounterCreationDataCollection CCDC = new CounterCreationDataCollection();
// Add the counter.
CounterCreationData ETimeData = new CounterCreationData();
ETimeData.CounterType = PerformanceCounterType.ElapsedTime;
ETimeData.CounterName = counterName;
CCDC.Add(ETimeData);
// Create the category.
PerformanceCounterCategory.Create(categoryName,
"Demonstrates ElapsedTime performance counter usage.",
PerformanceCounterCategoryType.SingleInstance, CCDC);
// Return, rerun the application to make use of the new counters.
return;
}
else
{
Console.WriteLine("Category exists - {0}", categoryName);
}
// Create the performance counter.
PerformanceCounter PC = new PerformanceCounter(categoryName,
counterName,
false);
// Initialize the counter.
PC.RawValue = Stopwatch.GetTimestamp();
DateTime Start = DateTime.Now;
// Loop for the samples.
for (int j = 0; j < 100; j++)
{
// Output the values.
if ((j % 10) == 9)
{
Console.WriteLine("NextValue() = " + PC.NextValue().ToString());
Console.WriteLine("Actual elapsed time = " + DateTime.Now.Subtract(Start).ToString());
OutputSample(PC.NextSample());
}
// Reset the counter on every 20th iteration.
if (j % 20 == 0)
{
PC.RawValue = Stopwatch.GetTimestamp();
Start = DateTime.Now;
}
System.Threading.Thread.Sleep(50);
}
Console.WriteLine("Elapsed time = " + DateTime.Now.Subtract(Start).ToString());
}
private static void OutputSample(CounterSample s)
{
Console.WriteLine("\r\n+++++++++++");
Console.WriteLine("Sample values - \r\n");
Console.WriteLine(" BaseValue = " + s.BaseValue);
Console.WriteLine(" CounterFrequency = " + s.CounterFrequency);
Console.WriteLine(" CounterTimeStamp = " + s.CounterTimeStamp);
Console.WriteLine(" CounterType = " + s.CounterType);
Console.WriteLine(" RawValue = " + s.RawValue);
Console.WriteLine(" SystemFrequency = " + s.SystemFrequency);
Console.WriteLine(" TimeStamp = " + s.TimeStamp);
Console.WriteLine(" TimeStamp100nSec = " + s.TimeStamp100nSec);
Console.WriteLine("++++++++++++++++++++++");
}
}
Imports System.Collections
Imports System.Collections.Specialized
Imports System.Diagnostics
Imports System.Runtime.InteropServices
Public Class App
Public Shared Sub Main()
CollectSamples()
End Sub
Private Shared Sub CollectSamples()
Dim categoryName As String = "ElapsedTimeSampleCategory"
Dim counterName As String = "ElapsedTimeSample"
If Not PerformanceCounterCategory.Exists(categoryName) Then
Dim CCDC As New CounterCreationDataCollection()
' Add the counter.
Dim ETimeData As New CounterCreationData()
ETimeData.CounterType = PerformanceCounterType.ElapsedTime
ETimeData.CounterName = counterName
CCDC.Add(ETimeData)
' Create the category.
PerformanceCounterCategory.Create(categoryName, _
"Demonstrates ElapsedTime performance counter usage.", _
PerformanceCounterCategoryType.SingleInstance, CCDC)
Else
Console.WriteLine("Category exists - {0}", categoryName)
End If
' Create the counter.
Dim PC As PerformanceCounter
PC = New PerformanceCounter(categoryName, counterName, False)
' Initialize the counter.
PC.RawValue = Stopwatch.GetTimestamp()
Dim Start As DateTime = DateTime.Now
' Loop for the samples.
Dim j As Integer
For j = 0 To 99
' Output the values.
If j Mod 10 = 9 Then
Console.WriteLine(("NextValue() = " _
+ PC.NextValue().ToString()))
Console.WriteLine(("Actual elapsed time = " _
+ DateTime.Now.Subtract(Start).ToString()))
OutputSample(PC.NextSample())
End If
' Reset the counter every 20th iteration.
If j Mod 20 = 0 Then
PC.RawValue = Stopwatch.GetTimestamp()
Start = DateTime.Now
End If
System.Threading.Thread.Sleep(50)
Next j
Console.WriteLine(("Elapsed time = " + _
DateTime.Now.Subtract(Start).ToString()))
End Sub
Private Shared Sub OutputSample(ByVal s As CounterSample)
Console.WriteLine(ControlChars.Lf + ControlChars.Cr + "+++++++")
Console.WriteLine("Sample values - " + ControlChars.Cr _
+ ControlChars.Lf)
Console.WriteLine((" BaseValue = " _
+ s.BaseValue.ToString()))
Console.WriteLine((" CounterFrequency = " + _
s.CounterFrequency.ToString()))
Console.WriteLine((" CounterTimeStamp = " + _
s.CounterTimeStamp.ToString()))
Console.WriteLine((" CounterType = " + _
s.CounterType.ToString()))
Console.WriteLine((" RawValue = " + _
s.RawValue.ToString()))
Console.WriteLine((" SystemFrequency = " + _
s.SystemFrequency.ToString()))
Console.WriteLine((" TimeStamp = " + _
s.TimeStamp.ToString()))
Console.WriteLine((" TimeStamp100nSec = " + _
s.TimeStamp100nSec.ToString()))
Console.WriteLine("+++++++")
End Sub
End Class
Комментарии
Примечание
Если вычисляемое значение счетчика зависит от двух операций чтения счетчика, первая операция чтения возвращает значение 0,0. Сброс свойств счетчика производительности для указания другого счетчика эквивалентен созданию нового счетчика производительности, а первая операция чтения с использованием новых свойств возвращает значение 0,0. Рекомендуемое время задержки NextValue между вызовами метода составляет одну секунду, чтобы позволить счетчику выполнить следующее добавочное чтение.
Примечание
Для чтения счетчиков производительности необходимо иметь права администратора. В Windows Vista привилегии пользователя определяются контролем учетных записей (UAC). Члену встроенной группы "Администраторы" присваивается два маркера доступа на время выполнения: маркер доступа обычного пользователя и маркер доступа администратора. По умолчанию назначена роль обычного пользователя. Чтобы выполнить код, который обращается к счетчикам производительности, необходимо сначала повысить привилегии от обычного пользователя до администратора. Это можно сделать при запуске приложения, , щелкнув значок приложения правой кнопкой мыши и указав, что приложение должно запускаться от имени администратора.