抄袭MSDN
通过 System.Diagnostics 监控您的应用程序
发布日期: 2006-08-14 | 更新日期: 2006-08-14
Brad McCabe
本页内容
问题总会有解决办法。您刚刚部署的应用程序在开发计算机上一切都好,但在生产中却出了差错。问题可能会马上显现,也可能会随着时间的推移慢慢显露。现在怎么办呢?
开发人员会匆忙推出代码的调试版本并重新部署,这种情形太常见了。加载这一特别版本时,通常会向磁盘上的某个文件中随机写入信息,以便开发人员以后进行研究,以弄清究竟发生了什么问题。除此之外一定还有更好的办法。
解决方案就在 System.Diagnostics 命名空间中,该命名空间提供了用于与事件日志、性能计数器和系统进程进行交互的类。您可以在生产应用程序中保持对此监控代码的启用,并在发生问题时查看相关信息。下面让我们看一下如何在应用程序中使用这些类。
事件日志
' 如果源不存在,则创建该
' 源。
If Not EventLog.SourceExists("MSDNDemo") Then
EventLog.CreateEventSource("MSDNDemo", _
"CustomLog")
End If
' 创建一个 EventLog 实例并指定其
' 源。
Dim myLog As New EventLog()
myLog.Source = "MSDNDemo"
' 向事件日志中写入一个信息性条目。
myLog.WriteEntry("Hello from the event log.")
上面部分的代码会检查您是否已经创建了事件的源。大多数开发人员都会使用其应用程序的名称,从而轻松快速地从事件日志的众多条目中找出该应用程序的事件。
如果源不存在,则会创建源,并将其与一个事件日志相关联。您可以使用该事件日志的现有部分,比如 Application 和 System 部分,也可以通过指定名称来创建您自己的部分(就像本演示这样)。
myLog.WriteEntry("Your error here.", _
EventLogEntryType.Error)
下面让我们来试试使用快速而容易的方法。Visual Basic® 2005 引入了 My 对象作为快速进入框架的手段。您可以使用 My 向事件日志中快速添加事件:
My.Application.Log.WriteException( _
"Written from My", TraceEventType.Warning, _
"Additional Information")
您也可以通过 WriteEntry 方法使用 My:My.Application.Log.WriteEntry("Written from My", TraceEventType.Error)
但如果您调用此方法并查看事件日志,则可能会看不到消息,因为 My 对象允许您根据配置文件中的设置,将您的消息路由到不同的侦听程序。有关这一极其强大的功能的详细论述不属于本专栏文章的范围,但您可以在"My.Application.Log 对象"找到更多信息。
性能计数器
事件日志是写入消息的理想场所,但如果想要知道应用程序运行时内部发生了什么,应该怎么办呢?此时理所当然应当选择性能计数器。
在该窗体上,放置一个标签和一个新计时器对象,使其 Enabled 属性设置为 true。添加以下代码:
Private Sub Timer1_Tick(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Timer1.Tick
Label1.Text = Me.PerformanceCounter1.NextValue
End Sub
在本示例中,让我们创建一个名为 TestCategory 的类别,并添加一个名为 TestCounter 的新计数器。这一次,您将通过代码访问该计数器。
首先将一个新计时器和按钮拖放到窗体上,然后向窗体中添加一个名为 counter 的私有变量:
Private counter As PerformanceCounter
'初始化计数器对象
counter = New PerformanceCounter("TestCategory", "TestCounter", False)
' 将其值设置为 0
counter.RawValue = 0
' 启动时间以更新该计数器
Timer2.Enabled = True
Counter.IncrementBy(New Random().Next(-5, 10))
这会导致该计数器按照 -5 到 10 之间的某个随机数递增。本示例使用了随机数,但这个数字还可以是已处理的销售或订单数、登录的用户数、记录的错误数或在您的应用程序中进行跟踪的任何有意义的事物。
在性能监视器运行的情况下,单击示例应用程序的按钮。您应该可以看到一个类似于图 6 的图形。
您在示例代码中可以看到使用了 IncrementBy 方法来增加或减少计数器的数值。如果您想要使计数器以 1 为增减幅度增加或减少,只需调用 Increment 和 Decrement 方法即可。
对于像本示例这样的使用服务器资源管理器的情形,一些开发人员会想是否可以通过代码完成所有操作。是的,您可以编写如下代码:
If Not
PerformanceCounterCategory.Exists("MSDNSample")
Then
PerformanceCounterCategory.Create("MSDNSample", _
"用于显示如何添加自定义计数器", _
PerformanceCounterCategoryType.SingleInstance, _
"MSDNSampleCounter", _
"用于显示如何添加自定义计数器")
End If
并将其添加到您的按钮单击事件中,以便完全通过代码创建不同的类别和计数器。如果您更新其他代码,使其指向这个类别和计数器,您将发现该项目可以完全像该示例一样运行和工作。
Process 类
本专栏文章至此已经让您了解了如何使用事件日志和性能计数器;下面让我们深入研究 System.Diagnostics 命名空间的第三个方面,即 Process 类。
首先,让我们定义一个进程:进程就是一个运行的应用程序。在具有 Process 类和正确权限的情况下,您可以访问有关用户系统中各个进程的信息,并执行诸如启动或中止这样的操作。
Process 类可以让您访问大量有关应用程序或其他进程的数据。对于此处的示例,让我们提升示例应用程序的基本优先级。
为了使用 Process 类,您首先需要获取对您的进程或其他进程的引用。由于您想要提升当前进程,因此您将使用:
Dim myProcess As Process = _
Process.GetCurrentProcess()
若要访问您的本地计算机或远程计算机上的其他进程,您需要改用 GetProcessessByName 方法:
Dim theProcesses() As Process = _
myprocess.GetProcessesByName( _
"ProcessName", "MachineName")
获得了进程引用后,您可以使用其属性找到有关该进程的大量信息。有关属性的完整列表,请参阅".NET Framework Class Library Process Members"(英文)。
myProcess.PriorityClass = ProcessPriorityClass.RealTime
Dim startInfo As New ProcessStartInfo("IExplore.exe")
startInfo.WindowStyle = ProcessWindowStyle.Minimized
startInfo.Arguments = "msdn.microsoft.com/vbasic"
Process.Start(startInfo)
Dim myDocumentsPath As String = _
Environment.GetFolderPath(Environment.SpecialFolder.Personal)
myProcess.StartInfo.FileName = myDocumentsPath + "\MyFile.doc"
myProcess.StartInfo.Verb = "Print"
myProcess.StartInfo.CreateNoWindow = True
myProcess.Start()
请将您的问题和意见发送至 basics@microsoft.com。
Brad McCabe 是 Microsoft 的一位项目经理,除了其他事务外,他还负责 MSDN 上的 Visual Basic Developer Center。













浙公网安备 33010602011771号