65.9K
CodeProject 正在变化。 阅读更多。
Home

一个简单的 PerformanceCounter StatusStripItem

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.83/5 (6投票s)

2007年2月19日

CPOL

4分钟阅读

viewsIcon

51560

downloadIcon

1655

一篇关于如何将 PerformanceCounter 用作状态栏上的小型图表文章。

Screenshot - PerformanceCounterStatusItem.gif

引言

这是一个非常简单的类,应该能让开发者的生活更舒适一些,仅此而已。它在 StatusStrip 中显示一个迷你图表,该图表反映了 PerformanceCounter 实例的变化。您可以将其用作简单的图表、带有文本的图表,或者仅为文本项。无论您在应用程序中使用多少项,它们都由一个 System.Timer.Timer 实例触发,以避免内存和资源浪费。祝您使用愉快。

警告

正如 Patrick Sears 的帖子中所说,PerformanceCounter 使用特定语言的值来表示 CategoryNameCounterNameInstanceName 属性。如果您使用的不是英文或德文系统,在打开演示项目后,有必要在您的系统上重置这些值;否则,程序将抛出异常。

背景

在开发一个通过 TWAIN 接口加载大量图像并将其发送到 SQL Server 的应用程序时,我发现我不得不经常打开任务管理器来查看 CPU 和内存的使用情况。由于我比较懒,有一天我决定应该有一种方法可以在 StatusStrip 中看到这些值,而不是使用第二个窗口。于是,我搜索了网络(优先选择 CodeProject 页面!)来了解如何实现这一点。我首先发现的是我需要使用 PerformanceCounter 类,这个类很容易管理。然后,我看到有很多解决方案,但没有一个能满足我需要一个非常易于使用的状态栏项的需求……所以,您猜我怎么做了……

使用 PerformanceCounterItem 控件

使用 ToolStripStatusPerformanceCounterItem 非常简单。如果该类与示例一样包含在您的项目中,或者已链接包含它的外部 DLL,只需将其实例添加到您的 StatusStrip 中即可。

Screenshot - PerformanceCounterStatusItem1.gif

然后,在您的窗体中添加一个 PerformanceCounter,并使用所需值配置其 CategoryNameCounterNameInstanceName 属性,并将该项的 PerformanceCounter 属性设置为此实例。就这么简单。(示例使用一个项显示处理器时间,另一个项显示已提交内存。)该项的行为将与其他任何 ToolStripStatusLabel 完全相同,其 Image 属性可以设置为任何图像,因此您可以使用其所有众所周知的属性,例如 TextImageRelation 属性来决定图像和文本的出现位置。要自定义图表,可以使用 ChartStyle 属性,您可以在其中选择一些颜色来根据您的需求调整控件。Caption 属性允许您将值显示为文本。它使用与 String.Format 方法相同的模式,因此您将很容易识别它。例如,代码

...
this.performanceCounterItem1.Caption = "{0:0} %"
...

将显示 CPU 使用率,显示为不带小数的数字,后跟 '%' 符号。使用 MaximumMinimum 属性,您可以调整图表中将显示的最大值和最小值。将 ChartStyle.AutoSizeText 属性设置为一个将占据可能值的最大长度的字符串,您可以防止该项的大小随着其值的每次更改而改变。这肯定不是解决此问题的最佳方法,但我希望有敏锐的程序员能向我展示一个更聪明的解决方案。

如果您需要该项的另一个实例,例如显示内存使用情况(如示例所示),则将 PerformanceCounter 实例添加到您的 Form 中,应用 CategoryNameCounterNameInstanceName 的所需设置,然后将新的 PerformanceCounterStatusItemPerformanceCounter 属性设置为此实例。

关注点

正如您所见,代码中并没有什么特别之处。唯一有趣的是代码使用了一个单独的计时器来触发每个项。由于它是一个 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 属性是一种权宜之计,因为我还没有找到任何格式字符串可以在不显示数字的情况下预留字符串空间。
  • ……肯定还有一些未满足的需求…… Screenshot - smiley_wink.gif
© . All rights reserved.