C # Измерение пропускной способности конкретного приложения - PullRequest
0 голосов
/ 08 октября 2018

Мне нужно измерить пропускную способность приложения, которое я сделал.Допустим, это приложение называется 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".

Что я делаю не так?

...