效能計數器是在效能計數器類型中,因此,建立效能計數器就需要先建立一個效能計數器類型。不過這兩個步驟通過一個函數調用就可以完成。
注意:
建立效能計數器需要程式以管理員方式運行,否則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效能監控器中也可以讀取該效能計數器的值。
開啟控制台中的“效能計數器”,添加效能計數器,選擇我們自訂的“我的類型”中的“我的計數器”效能計數器:
然後把類型改成“報告”,讀取效能計數器的原始值:
結果這樣:(左面是效能監控器的顯示,右面是我們程式的輸出)