本例是利用C#中的性能計數(shù)器(PerformanceCounter)監(jiān)控網(wǎng)絡(luò)的狀態(tài)。并能夠直觀的展現(xiàn)出來
涉及到的知識點:
PerformanceCounter,表示 Windows NT 性能計數(shù)器組件。NextValue() 即獲取計數(shù)器樣本并為其返回計算所得值。PerformanceCounterCategory 表示性能對象,它定義性能計數(shù)器的類別。通過這兩個即可得到計數(shù)器的信息。
Chart 圖表,VS自帶的Chart圖表,大大簡化了對圖表的開發(fā)。關(guān)于Chart,此前已有例子說明。
Queue 隊列表示對象的先進(jìn)先出集合。關(guān)于Queue此前已有例子說明。
TreeView 顯示標(biāo)記項的分層集合,每個標(biāo)記項用一個 System.Windows.Forms.TreeNode 來表示。即VS自帶的樹狀菜單
Timer 實現(xiàn)按用戶定義的時間間隔引發(fā)事件的計時器。此計時器最宜用于 Windows 窗體應(yīng)用程序中,并且必須在窗口中使用。定時刷新計數(shù)器中的值。
效果圖如下:

關(guān)于可用的計數(shù)器列表【計數(shù)器有很多,一級菜單是計數(shù)器的類別,二級菜單是計數(shù)器InstanceName,三級菜單是計數(shù)器名稱】,如下圖所示:

代碼如下:
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Windows.Forms.DataVisualization.Charting;using System.Diagnostics;namespace DemoSharp{  public partial class NetworkMonitor : Form  {    private PerformanceCounter mCounter;//當(dāng)前計數(shù)器    private Queue<double> dataQueue = new Queue<double>(100);//初始化隊列    public NetworkMonitor()    {      InitializeComponent();      InitCounterCategory();      InitChart();    }    /// <summary>    /// 初始化計數(shù)器信息    /// </summary>    private void InitCounterCategory() {      //獲取所有的計數(shù)器類別      var counterCategories = PerformanceCounterCategory.GetCategories().OrderBy(p=>p.CategoryName);      int i=0;      foreach (var counterCategory in counterCategories) {        //屬于線程級別的不顯示        if (counterCategory.CategoryName == "Thread") {          continue;        }        //將信息綁定的TreeView上        this.tvCategory.CheckBoxes = true;        this.tvCategory.Nodes.Add(counterCategory.CategoryName);        string[] instanceNames = counterCategory.GetInstanceNames();        int j = 0;        foreach (var instanceName in instanceNames) {          this.tvCategory.Nodes[i].Nodes.Add(instanceName);          var counters = counterCategory.GetCounters(instanceName).Select(p=>string.Format("{0}",p.CounterName));          int k = 0;          foreach (var counter in counters) {            this.tvCategory.Nodes[i].Nodes[j].Nodes.Add(counter);            k++;          }          j++;        }        i++;      }      //初始化Counter      PerformanceCounterCategory pcCategory = new PerformanceCounterCategory("Network Interface");      string[] iNames = pcCategory.GetInstanceNames();      PerformanceCounter[] pCounters = pcCategory.GetCounters(iNames[0]);      //給網(wǎng)絡(luò)監(jiān)控計數(shù)器賦值      mCounter = pCounters[0];      mCounter.NextValue();//初始值    }     //<summary>     //初始化圖表     //</summary>    private void InitChart()    {      //定義圖表區(qū)域      this.chart1.ChartAreas.Clear();      ChartArea chartArea1 = new ChartArea("C1");      this.chart1.ChartAreas.Add(chartArea1);      //定義存儲和顯示點的容器      this.chart1.Series.Clear();      Series series1 = new Series("S1");      series1.ChartArea = "C1";      this.chart1.Series.Add(series1);      //設(shè)置圖表顯示樣式      this.chart1.ChartAreas[0].AxisY.ArrowStyle = AxisArrowStyle.SharpTriangle;      this.chart1.ChartAreas[0].AxisY.Title = "Kkbps";//坐標(biāo)軸的標(biāo)題      this.chart1.ChartAreas[0].AxisY.TextOrientation = TextOrientation.Rotated270;      this.chart1.ChartAreas[0].AxisY.Minimum = 0;      this.chart1.ChartAreas[0].AxisY.Maximum = 50;      this.chart1.ChartAreas[0].AxisY.Interval = 5;      this.chart1.ChartAreas[0].AxisX.Interval = 5;      this.chart1.ChartAreas[0].AxisX.ArrowStyle = AxisArrowStyle.SharpTriangle;      this.chart1.ChartAreas[0].AxisX.Title = "Sec";      this.chart1.ChartAreas[0].AxisX.TextOrientation = TextOrientation.Horizontal;      this.chart1.ChartAreas[0].AxisX.MajorGrid.LineColor = System.Drawing.Color.Silver;      this.chart1.ChartAreas[0].AxisY.MajorGrid.LineColor = System.Drawing.Color.Silver;      //設(shè)置標(biāo)題      this.chart1.Titles.Clear();      this.chart1.Titles.Add("S01");      this.chart1.Titles[0].Text = "XXX網(wǎng)絡(luò)監(jiān)控顯示";      this.chart1.Titles[0].ForeColor = Color.RoyalBlue;      this.chart1.Titles[0].Font = new System.Drawing.Font("Microsoft Sans Serif", 12F);      //設(shè)置圖表顯示樣式      this.chart1.Series[0].Color = Color.LightGreen;      this.chart1.Series[0].ChartType = SeriesChartType.Area;//圖表形狀      this.chart1.Series[0].Points.Clear();    }    /// <summary>    /// 啟動定時器    /// </summary>    /// <param name="sender"></param>    /// <param name="e"></param>    private void btnStart_Click(object sender, EventArgs e)    {      this.timer1.Start();          }    /// <summary>    /// 停止定時器    /// </summary>    /// <param name="sender"></param>    /// <param name="e"></param>    private void btnStop_Click(object sender, EventArgs e)    {      this.timer1.Stop();    }    /// <summary>    /// 定時執(zhí)行函數(shù)    /// </summary>    /// <param name="sender"></param>    /// <param name="e"></param>    private void timer1_Tick(object sender, EventArgs e)    {      UpdateQueueValue();      this.chart1.Series[0].Points.Clear();      if (dataQueue.Max() > this.chart1.ChartAreas[0].AxisY.Maximum) {        this.chart1.ChartAreas[0].AxisY.Maximum = Math.Ceiling(dataQueue.Max() / 10) * 10;        this.chart1.ChartAreas[0].AxisY.Interval = this.chart1.ChartAreas[0].AxisY.Maximum / 10;      }      for (int i = 0; i < dataQueue.Count; i++)      {        this.chart1.Series[0].Points.AddXY((i + 1), dataQueue.ElementAt(i));      }    }     //更新隊列中的值    private void UpdateQueueValue()    {      if (dataQueue.Count > 100)      {        dataQueue.Dequeue();      }      //獲取的值就Byte/s 所以要除以1024      dataQueue.Enqueue(mCounter.NextValue() / (1024));    }    /// <summary>    /// 當(dāng)選中復(fù)選框時發(fā)生    /// </summary>    /// <param name="sender"></param>    /// <param name="e"></param>    private void tvCategory_AfterCheck(object sender, TreeViewEventArgs e)    {      bool flag = e.Node.Checked;//取得選中狀態(tài),所有子節(jié)點的狀態(tài)保持一致      CheckedStated(e.Node.Nodes, flag);    }    /// <summary>    /// 采用遞歸方法修改節(jié)點的選中狀態(tài)    /// </summary>    /// <param name="nodes"></param>    /// <param name="flag"></param>    private void CheckedStated(TreeNodeCollection nodes,bool flag) {            if (nodes != null)      {        foreach (TreeNode node in nodes)        {          node.Checked = flag;          CheckedStated(node.Nodes, flag);        }      }    }  }}備注:性能計數(shù)器類別獲取出現(xiàn)異常的解決方案:
在CMD命令窗口中,執(zhí)行 LODCTR /R 重置性能計數(shù)器。如下圖所示:

如果依然不行,嘗試以管理員身份運行【勾上】,如下圖所示:

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。
新聞熱點
疑難解答
圖片精選