一个简单的 PerformanceCounter StatusStripItem
一篇关于如何将 PerformanceCounter 用作状态栏上的小型图表文章。
引言
这是一个非常简单的类,应该能让开发者的生活更舒适一些,仅此而已。它在 StatusStrip
中显示一个迷你图表,该图表反映了 PerformanceCounter
实例的变化。您可以将其用作简单的图表、带有文本的图表,或者仅为文本项。无论您在应用程序中使用多少项,它们都由一个 System.Timer.Timer
实例触发,以避免内存和资源浪费。祝您使用愉快。
警告
正如 Patrick Sears 的帖子中所说,PerformanceCounter
使用特定语言的值来表示 CategoryName
、CounterName
和 InstanceName
属性。如果您使用的不是英文或德文系统,在打开演示项目后,有必要在您的系统上重置这些值;否则,程序将抛出异常。
背景
在开发一个通过 TWAIN 接口加载大量图像并将其发送到 SQL Server 的应用程序时,我发现我不得不经常打开任务管理器来查看 CPU 和内存的使用情况。由于我比较懒,有一天我决定应该有一种方法可以在 StatusStrip
中看到这些值,而不是使用第二个窗口。于是,我搜索了网络(优先选择 CodeProject 页面!)来了解如何实现这一点。我首先发现的是我需要使用 PerformanceCounter
类,这个类很容易管理。然后,我看到有很多解决方案,但没有一个能满足我需要一个非常易于使用的状态栏项的需求……所以,您猜我怎么做了……
使用 PerformanceCounterItem 控件
使用 ToolStripStatusPerformanceCounterItem
非常简单。如果该类与示例一样包含在您的项目中,或者已链接包含它的外部 DLL,只需将其实例添加到您的 StatusStrip
中即可。
然后,在您的窗体中添加一个 PerformanceCounter
,并使用所需值配置其 CategoryName
、CounterName
和 InstanceName
属性,并将该项的 PerformanceCounter
属性设置为此实例。就这么简单。(示例使用一个项显示处理器时间,另一个项显示已提交内存。)该项的行为将与其他任何 ToolStripStatusLabel
完全相同,其 Image
属性可以设置为任何图像,因此您可以使用其所有众所周知的属性,例如 TextImageRelation
属性来决定图像和文本的出现位置。要自定义图表,可以使用 ChartStyle
属性,您可以在其中选择一些颜色来根据您的需求调整控件。Caption
属性允许您将值显示为文本。它使用与 String.Format
方法相同的模式,因此您将很容易识别它。例如,代码
...
this.performanceCounterItem1.Caption = "{0:0} %"
...
将显示 CPU 使用率,显示为不带小数的数字,后跟 '%' 符号。使用 Maximum
和 Minimum
属性,您可以调整图表中将显示的最大值和最小值。将 ChartStyle.AutoSizeText
属性设置为一个将占据可能值的最大长度的字符串,您可以防止该项的大小随着其值的每次更改而改变。这肯定不是解决此问题的最佳方法,但我希望有敏锐的程序员能向我展示一个更聪明的解决方案。
如果您需要该项的另一个实例,例如显示内存使用情况(如示例所示),则将 PerformanceCounter
实例添加到您的 Form
中,应用 CategoryName
、CounterName
和 InstanceName
的所需设置,然后将新的 PerformanceCounterStatusItem
的 PerformanceCounter
属性设置为此实例。
关注点
正如您所见,代码中并没有什么特别之处。唯一有趣的是代码使用了一个单独的计时器来触发每个项。由于它是一个 System.Timer.Timer
实例,我们必须使用 AsyncOperation
的实例在适当的线程上调用事件处理程序。
#region timer_Elapsed(object sender, ElapsedEventArgs e)
static void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
foreach (ToolStripPerformanceCounterItem item in instances)
{
// post the actual values via the asyncOperation
if(item.PerformanceCounter != null)
item.asyncOperation.Post(item.timerAsyncCallBack,
values[item.PerformanceCounter]);
}
}
#endregion
历史
这是该控件的第一个版本。我不确定它是否值得增强,因为它已经满足了我目前的所有需求。
存在一些明显的不足之处可以消除,但我肯定没有足够的时间去做到这一点
- 如果使用了最大值不固定的
PerformanceCounter
,目前无法将其显示为图表。 Minimum
属性尚未实现。- 如果使用
BorderSides
属性,图像将不匹配。这不是很必要,但这样看起来会更好。 - 没有
ToolBoxBitmap
,但老实说,我不知道如何添加它,以便StatusStrip
的下拉框能显示它。 AutoSizeText
属性是一种权宜之计,因为我还没有找到任何格式字符串可以在不显示数字的情况下预留字符串空间。- ……肯定还有一些未满足的需求……