2016-01-19 6 views
1

Я пытаюсь использовать класс C# PerformanceCounter для возврата системных показателей.Bytes Received всегда возвращается 0

// Initialisation 
// Threads (total threads for all processes) 
PerformanceCounter performThreads = new System.Diagnostics.PerformanceCounter(); 
((ISupportInitialize)(performThreads)).BeginInit(); 
performThreads.CategoryName = "System"; 
performThreads.CounterName = "Threads"; 
((ISupportInitialize)(performThreads)).EndInit(); 

// Bytes received (cumulative total bytes received over all open socket connections) 
private PerformanceCounter m_pcSys_BytesSent; 
PerformanceCounter performBytesR = new System.Diagnostics.PerformanceCounter(); 
((ISupportInitialize)(performBytesR)).BeginInit(); 
performBytesR.CategoryName = ".NET CLR Networking"; 
performBytesR.CounterName = "Bytes Received"; 
performBytesR.InstanceName = "_global_"; 
((ISupportInitialize)(performBytesR)).EndInit(); 

// Later on ... periodically poll performance counters 
long lThreads = performThreads.RawValue; // Works! 
long lBytesR = performBytesR.RawValue;  // Always returns 0 :o(

Последняя строка выше работ, в том смысле, что он не бросает исключение, но всегда возвращает 0.

Я попытался как NextSample и NextValue с тем же результатом. Если я изменю InstanceName на имя процесса, я снова получаю тот же результат. Если InstanceName настроено на что-либо еще, исключение Instance 'XYZ' does not exist in the specified Category. бросается, когда я звоню RawValue.

Любые идеи?

+0

Используйте сниффер, как скрипач или проводов, чтобы проверить, что данные отправляются/принимаются по сети. – jdweng

+0

@AlainD: Если вы собираетесь собирать показатели уровня системы, см., Если [Statsify] (https://bitbucket.org/aeroclub-it/statsify) соответствует вашим потребностям. –

+0

@jdweng: данные, безусловно, отправляются/принимаются, потому что я подключен к различным серверам с помощью сокетов Windows. Я могу подсчитать байты, отправляемые и полученные вручную (и они отличные от нуля). Проблема заключается в том, что счетчики производительности сети .NET должны быть специально активированы в соответствии с ответом Антона. – AlainD

ответ

1

По Networking Performance Counters:

Сетевые счетчики производительности должны быть включены в файл конфигурации, которые будут использоваться.

Если сетевые счетчики включены, это создаст и обновит как для каждого приложения, так и для глобальных счетчиков производительности. Если отключено, приложение не будет предоставлять данные счетчика производительности сети.

+0

Это сработало! Но не без хлопот. Если требуемая запись '' помещается в верхнюю часть файла app.config, то для моего приложения сеть полностью прекращается (больше нельзя подключаться через сокеты). У меня была строка подключения SQLEXPRESS в app.config. Помещая '' в нижней части app.config, процесс начал возвращать полученные и отправленные байты! Благодарю. – AlainD

Смежные вопросы