.NET(C#):建立一個效能計數器(PerformanceCounter)

來源:互聯網
上載者:User

效能計數器是在效能計數器類型中,因此,建立效能計數器就需要先建立一個效能計數器類型。不過這兩個步驟通過一個函數調用就可以完成。

注意:

建立效能計數器需要程式以管理員方式運行,否則System.UnauthorizedAccessException異常會拋出。

 

建立一個效能計數器需要調用PerformanceCounterCategory.Create,參數是:類型名稱,類型描述,效能計數器類型的種類(執行個體種類),建立計數器的資料。

建立計數器的資料是CounterCreationDataCollection,這個類儲存一系列的CounterCreationData,後者指定效能計數器的名稱和類型(還有其他一些不太重要的資訊)。

 

建立好效能計數器就可以對他進行值的寫入了,步驟就是建立一個不是唯讀效能計數器對象:PerformanceCounter類型,吧ReadOnly設定成false(在建構函式中也可以設定)。然後通過PerformanceCounter的Increase,Decrease或者IncreaseBy,DecreaseBy方法來改變效能計數器的原始值。這些操作都是原子性的。當然如果如果你的效能計數器更新不需要線程原子性,可以直接通過修改PerformanceCounter.RawValue來更改效能計數器的原始值,這樣可以節省些效能。

 

下面代碼,建立一個自訂效能計數器,然後邊寫入值邊讀取值,按任意鍵可結束輸出。(注意:第一次運行會首先建立效能計數器,因此需要程式以管理員方式運行。但後續運行不需要管理員身份,因為僅僅是寫入和讀取效能計數器的原始值)

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Reflection;

using System.Diagnostics;

using System.Threading;

 

namespace Mgen

{

    class Program

    {

        static void Main()

        {

            //嘗試建立效能計數器類型和效能計數器

            Create();

            //讀取效能計數器原始值

            ThreadPool.QueueUserWorkItem((arg) => ReadValues());

            //寫入效能計數器原始值

            ThreadPool.QueueUserWorkItem((arg) => WritesValues());

            //控制台按鍵控制

            Console.ReadKey(true);

        }

 

        static void Create()

        {

            //判斷是否已經存在

            if (PerformanceCounterCategory.Exists("我的類型"))

                return;

 

            //建立CounterCreationData

            var ccd = new CounterCreationData();

            //名稱為:我的計數器,類型是:NumberOfItems64

            ccd.CounterName = "我的計數器";

            ccd.CounterType = PerformanceCounterType.NumberOfItems64;

 

            PerformanceCounterCategory.Create("我的類型",           //類型名稱

                "Mgen的計數器測試",                                 //類型描述

                PerformanceCounterCategoryType.SingleInstance,     //類型的執行個體種類

                new CounterCreationDataCollection() { ccd });      //建立效能計數器資料

        }

 

        static void WritesValues()

        {

            //檢查是否類型或者計數器不存在

            if (!PerformanceCounterCategory.Exists("我的類型") || !PerformanceCounterCategory.CounterExists("MyCounter", "MyCategory"))

            {

                Console.WriteLine("不存在需要的效能計數器");

                return;

            }

 

            //增加計數器的原始值

            using (var couter = new PerformanceCounter("我的類型", "我的計數器", false))

            {

                while (true)

                {

                    couter.IncrementBy(2);

                    Thread.Sleep(1000);

                }

            }

        }

 

        static void ReadValues()

        {

            //檢查是否類型或者計數器不存在

            if (!PerformanceCounterCategory.Exists("我的類型") || !PerformanceCounterCategory.CounterExists("MyCounter", "MyCategory"))

            {

                Console.WriteLine("不存在需要的效能計數器");

                return;

            }

 

            //讀取計數器的原始值

            using (var couter = new PerformanceCounter("我的類型", "我的計數器", true))

            {

                while (true)

                {

                    Console.WriteLine(couter.RawValue);

                    Thread.Sleep(1000);

                }

            }

        }

    }

 

}

 

 

 

程式輸出會逐漸將效能計數器的原始值加2:

2

4

6

8

...

在Windows效能監控器中也可以讀取該效能計數器的值。

 

開啟控制台中的“效能計數器”,添加效能計數器,選擇我們自訂的“我的類型”中的“我的計數器”效能計數器:

 

然後把類型改成“報告”,讀取效能計數器的原始值:

 

結果這樣:(左面是效能監控器的顯示,右面是我們程式的輸出)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.