代码之家  ›  专栏  ›  技术社区  ›  pookie

测量特定应用程序的带宽

  •  1
  • pookie  · 技术社区  · 7 年前

    我需要测量我制作的应用程序的带宽。假设这个应用程序被调用 myapp.exe .

    我做了一个图书馆叫 BandwidthMonitor (BM)从内部调用 . 定期电话 BM.Measure() BandwidthMeasurement .

    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公司 实例化以确保 是完全加载和操作第一(我认为这是毫无意义的,但我不知道还有什么可以尝试。。。抓住救命稻草。
    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也找不到实例名称。

    我一直有例外:

    我做错什么了?

    0 回复  |  直到 7 年前