Мне нужно измерить пропускную способность приложения, которое я сделал.Допустим, это приложение называется myapp.exe
.
. Я создал библиотеку с именем BandwidthMonitor
(BM), которая вызывается из myapp.exe
.myapp.exe
периодически вызывает BM.Measure()
, который возвращает BandwidthMeasurement
.
My BM
выглядит следующим образом:
public class BandwidthMonitor
{
PerformanceCounter bandwidthCounter;
PerformanceCounter dataReceivedCounter;
PerformanceCounter dataSentCounter;
List<float> byetsSent = new List<float>();
List<float> byetsReceived = new List<float>();
List<float> byetsUtilization = new List<float>();
float bandwidth;
int ticks = 0;
static string categoryName = ".NET CLR Networking 4.0.0.0";
public BandwidthMonitor()
{
try
{
bandwidthCounter = new PerformanceCounter();
bandwidthCounter.CategoryName = categoryName;
bandwidthCounter.CounterName = "Current Bandwidth";
bandwidthCounter.InstanceName = instance;
bandwidthCounter.ReadOnly = true;
dataReceivedCounter = new PerformanceCounter();
dataReceivedCounter.CategoryName = categoryName;
dataReceivedCounter.CounterName = "Bytes Received/sec";
dataReceivedCounter.InstanceName = instance;
dataReceivedCounter.ReadOnly = true;
dataSentCounter = new PerformanceCounter();
dataSentCounter.CategoryName = categoryName;
dataSentCounter.CounterName = "Bytes Sent/sec";
dataSentCounter.InstanceName = instance;
dataSentCounter.ReadOnly = true;
Console.WriteLine("Bandwidth monitor ready.");
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
public BandwidthMeasurement Measure()
{
var measurement = new BandwidthMeasurement();
ticks++;
try
{
var bytesSent = dataSentCounter.RawValue;
var bytesReceived = dataReceivedCounter.RawValue;
measurement.BytesSent = bytesSent;
measurement.ByesReceived = bytesReceived;
double utilization = (8 * (bytesSent + bytesReceived)) / (bandwidth * ticks) * 100;
measurement.Utilization = utilization;
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
return measurement;
}
//https://stackoverflow.com/a/27418721/596841
private static string GetInstanceName()
{
string returnvalue = "not found";
//Checks bandwidth usage for CUPC.exe..Change it with your application Name
string applicationName = "myapp";
PerformanceCounterCategory[] Array = PerformanceCounterCategory.GetCategories();
for (int i = 0; i < Array.Length; i++)
{
if (Array[i].CategoryName.Contains(categoryName))
foreach (var item in Array[i].GetInstanceNames())
{
Console.WriteLine(item);
if (item.ToLower().Contains(applicationName.ToString().ToLower()))
returnvalue = item;
}
}
return returnvalue;
}
}
По какой-то причине GetInstanceName()
всегда возвращает not found
,Я не могу понять, почему.
Я пробовал:
- настройки
categoryName
до .NET CLR Networking
- передача
myapp
processId
в BM
и поиск категории. - задерживает точку, в которой создается экземпляр
BM
, чтобы гарантировать, что myapp
полностью загружен и работает в первую очередь (я думаю, довольно бессмысленно, но я не знаючто еще попробовать ... хватаясь за соломинку здесь!).
PerformanceCounterCategory category = new PerformanceCounterCategory(".NET CLR Networking 4.0.0.0"); // and without the 4.0.0.0
var instanceNames = category.GetInstanceNames().Where(i => i.Contains(string.Format("p{0}", processId)));
if (instanceNames.Count() == 0) throw new Exception("Instance name not found");
Передача processId также не находит имя экземпляра.
Я получаю исключение:
Не удалось найти счетчик производительности с указанным именем категории ".NET CLR Networking 4.0.0.0".
Что я делаю не так?