我需要测量我制作的应用程序的带宽。假设这个应用程序被调用
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也找不到实例名称。
我一直有例外:
我做错什么了?