2013-04-24 7 views
8

Я пишу программу, которая использует счетчик производительности .NET, чтобы получить процессор, память и использование сети для определенного процесса.Мониторинг производительности сети для определенного процесса

Например, для получения данных процессора и памяти для Explorer, я создаю счетчики производительности, как это:

PerformanceCounter PC = new PerformanceCounter(); 
PC.CategoryName = "Process"; 
PC.CounterName = "% Processor Time"; 
PC.InstanceName = "Explorer"; 

PerformanceCounter PC = new PerformanceCounter(); 
PC.CategoryName = "Process"; 
PC.CounterName = "Working Set - Private"; 
PC.InstanceName = "Explorer"; 

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

+0

похоже, что что-то подобное было задано раньше: http: //stackoverflow.com/questions/438240/monitor-a-processs-network-usage – Dilshod

+2

Это архитектурное ограничение. Эти счетчики реализуются стеком сетевых драйверов. Что работает в режиме ядра, у него нет информации об использовании процесса usermode. Тот же тип причины, почему FileSystemWatcher не может сказать вам, какой процесс изменил файл. –

ответ

0

Я полагаю, что вы можете использовать сеть только для всей системы. Вы можете использовать этот код:

GetCounterValue(_netRecvCounters[index], "Network Interface", "Bytes Received/sec",  _instanceNames[index]): 

double GetCounterValue(PerformanceCounter pc, string categoryName, string counterName, string instanceName) 
{ 
    pc.CategoryName = categoryName; 
    pc.CounterName = counterName; 
    pc.InstanceName = instanceName; 
    return pc.NextValue(); 
} 

С PerformanceCounters, вы можете получить только те значения, которые Microsoft хотят, чтобы вы имели доступ к.

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