国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C#利用性能計數器監控網絡狀態

2019-10-29 21:16:02
字體:
來源:轉載
供稿:網友

本例是利用C#中的性能計數器(PerformanceCounter)監控網絡的狀態。并能夠直觀的展現出來

涉及到的知識點:

PerformanceCounter,表示 Windows NT 性能計數器組件。NextValue() 即獲取計數器樣本并為其返回計算所得值。PerformanceCounterCategory 表示性能對象,它定義性能計數器的類別。通過這兩個即可得到計數器的信息。

Chart 圖表,VS自帶的Chart圖表,大大簡化了對圖表的開發。關于Chart,此前已有例子說明。

Queue 隊列表示對象的先進先出集合。關于Queue此前已有例子說明。

TreeView 顯示標記項的分層集合,每個標記項用一個 System.Windows.Forms.TreeNode 來表示。即VS自帶的樹狀菜單

Timer 實現按用戶定義的時間間隔引發事件的計時器。此計時器最宜用于 Windows 窗體應用程序中,并且必須在窗口中使用。定時刷新計數器中的值。

效果圖如下:

C#,計數器,網絡狀態

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

C#,計數器,網絡狀態

代碼如下:

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;//當前計數器    private Queue<double> dataQueue = new Queue<double>(100);//初始化隊列    public NetworkMonitor()    {      InitializeComponent();      InitCounterCategory();      InitChart();    }    /// <summary>    /// 初始化計數器信息    /// </summary>    private void InitCounterCategory() {      //獲取所有的計數器類別      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]);      //給網絡監控計數器賦值      mCounter = pCounters[0];      mCounter.NextValue();//初始值    }     //<summary>     //初始化圖表     //</summary>    private void InitChart()    {      //定義圖表區域      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);      //設置圖表顯示樣式      this.chart1.ChartAreas[0].AxisY.ArrowStyle = AxisArrowStyle.SharpTriangle;      this.chart1.ChartAreas[0].AxisY.Title = "Kkbps";//坐標軸的標題      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;      //設置標題      this.chart1.Titles.Clear();      this.chart1.Titles.Add("S01");      this.chart1.Titles[0].Text = "XXX網絡監控顯示";      this.chart1.Titles[0].ForeColor = Color.RoyalBlue;      this.chart1.Titles[0].Font = new System.Drawing.Font("Microsoft Sans Serif", 12F);      //設置圖表顯示樣式      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>    /// 定時執行函數    /// </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>    /// 當選中復選框時發生    /// </summary>    /// <param name="sender"></param>    /// <param name="e"></param>    private void tvCategory_AfterCheck(object sender, TreeViewEventArgs e)    {      bool flag = e.Node.Checked;//取得選中狀態,所有子節點的狀態保持一致      CheckedStated(e.Node.Nodes, flag);    }    /// <summary>    /// 采用遞歸方法修改節點的選中狀態    /// </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);        }      }    }  }}

備注:性能計數器類別獲取出現異常的解決方案:

在CMD命令窗口中,執行 LODCTR /R 重置性能計數器。如下圖所示:

C#,計數器,網絡狀態

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

C#,計數器,網絡狀態

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 吉水县| 图片| 嘉祥县| 民乐县| 砀山县| 清水河县| 林口县| 陵川县| 敦化市| 贞丰县| 敦煌市| 东城区| 定州市| 克什克腾旗| 乌鲁木齐市| 满城县| 扎兰屯市| 昌黎县| 益阳市| 土默特右旗| 尉氏县| 敦化市| 建瓯市| 北碚区| 莫力| 南乐县| 乡城县| 麻栗坡县| 呼和浩特市| 常宁市| 株洲县| 睢宁县| 朝阳市| 庄浪县| 潮州市| 金秀| 健康| 渭南市| 荔波县| 景东| 外汇|