编程中的定时器、服务与集合应用
立即解锁
发布时间: 2025-08-17 00:11:11 阅读量: 13 订阅数: 12 


Visual Basic .NET编程技巧与实践
# 编程中的定时器、服务与集合应用
## 1. 定时器事件计时
在编程中,定时器是一种常用的工具,用于在特定时间间隔触发事件。现在,我们可以动态创建定时器,而无需在窗体上放置占位组件。以下是动态声明和初始化定时器的代码示例:
```vb
oTimer = New Timer()
oTimer.Interval = 100 ‘10 ticks per second
AddHandler oTimer.Tick, AddressOf oTimerTick
oTimer.Enabled = True
```
这段代码创建了一个定时器,设置其每 100 毫秒触发一次 `Tick` 事件,并将该事件附加到名为 `oTimerTick` 的过程,最后启动定时器。
### 1.1 动态事件处理
`AddHandler` 语句是这段代码中最有趣的部分。它允许在运行时动态添加和删除事件处理程序,这非常强大。例如,我们可以为 `Tick` 事件编写两个不同的事件处理程序,并在需要时进行切换,伪代码如下:
```vb
If (some value is even) then
RemoveHandler oTimer.Tick, AddressOf OddEvent
AddHandler oTimer.Tick, AddressOf EvenEvent
Else
RemoveHandler oTimer.Tick, AddressOf EvenEvent
AddHandler oTimer.Tick, AddressOf OddEvent
End if
```
这种动态分配事件的能力不仅适用于定时器控件,还可以用于在运行时创建任何类型的控件,并将其事件与我们编写的代码关联起来。
### 1.2 非可视化控件添加
在 VB6 创建的项目中,仍然可以使用旧方法添加大多数非可视化控件。不过,这些控件不再直接显示在窗体上,而是在 IDE 中窗体设计区域下方的特殊位置显示。
## 2. Windows 服务
现在,我们可以编写运行在 Windows NT 或 Windows 2000 上的服务,这是以前 VB 程序员无法做到的。
### 2.1 适用场景
任何需要一直运行但通常不需要显示界面的程序都适合作为 Windows 服务,例如监控程序、病毒检查程序和安全监视程序等。
### 2.2 示例:RAM 监控服务
以一个 RAM 监控服务为例,它使用性能计数器对象来轮询可用 RAM 的数量,并将该数值写入事件日志。该服务硬编码为每 10 秒进行一次轮询,在实际应用中,轮询间隔可能会更长,甚至可以由用户配置。
### 2.3 创建和配置服务
创建 Windows 服务是创建新项目时可以选择的项目类型之一。创建此类项目后,会得到一个包含预定义类的基础项目,该类有助于将服务安装到计算机上。具体步骤如下:
1. **命名服务**:将主对象的 `ServiceName` 属性更改为一个易于记忆的名称,该名称在正确安装服务后会显示在计算机的可用服务列表中。
2. **编写服务逻辑**:在预定义代码中,默认的服务类提供了空的 `OnStart` 和 `OnStop` 方法,分别在服务启动(手动或系统启动时)和停止时调用。在 `OnStart` 方法中,应声明服务所需的资源并初始化数据;在 `OnStop` 方法中,清理这些资源。
```vb
Protected Overrides Sub OnStart(ByVal args() As String)
oEventLog.WriteEntry(Me.ServiceName & “ service started”)
oTimer.Enabled = True
End Sub
```
3. **服务运行机制**:仅在 `OnStart` 和 `OnStop` 方法中编写代码很难实现有用的服务,需要一种“挂钩”机制来使服务在运行时持续工作。可以使用定时器对象、文件系统监视器对象、调度器对象等在指定时间运行代码。示例中使用了定时器对象,在定时器的每个周期,服务会更新计数器,当达到 10 秒的里程碑时,调用一个过程将可用 RAM 写入事件日志。
```vb
Private Sub oTimer_Elapsed(ByVal sender As System.Object, ByVal _
e As System.Timers.ElapsedEventArgs) Handles oTimer.Elapsed
Const RECORDEVERY As Integer = 10
iCtr += 1
If iCtr Mod RECORDEVERY = 0 Then
Call RecordAvailableRAM()
iCtr = 0
End If
End Sub
Private Sub RecordAvailableRAM()
Dim oCounter As PerformanceCounter
Dim r As Long
Try
oCounter = New PerformanceCounter(“Memory”, _
“Available Bytes”)
r = oCounter.RawValue()
oEventLog.WriteEntry(“RAM: Available Bytes = “ & _
r.ToString)
Catch oEX As Exception
oEventLog.WriteEntry(“tagTestService failed: “ & _
oEX.Message)
End Try
End Sub
```
4. **安装服务**:服务编译完成后,使用 `InstallUtil` 程序从命令行进行安装。
```
Installutil prjWindowsService.EXE
```
安装成功后,会收到相应的消息,通过查看 Windows 服务列表可以确认安装情况。
### 2.4 服务运行验证
启动和停止服务进行测试,然后查看事件日志,以验证服务是否正常执行。
## 3. 集合
集合是一种主要用于包含一组对象的类。.NET 框架中内置了许多集合,也可以创建自己的集合类。以下是一些常见的集合类型及其使用示例。
### 3.1 NameValueCollection
`NameValueCollection` 类用于存储字符串键值对。例如,可以使用它来存储员工姓名和他们的社会保险号码,每个员工的社会保险号码(因为是唯一的)可以作为键来查找相应员工的姓名。以下是其常见用法的代码示例:
```vb
Private Sub cbNameValueCollection_Click(ByVal sender As _
System.Object, ByVal e As System.EventArgs) Handles _
cbNameValueCollection.Click
Dim oNVC As New NameValueCollection()
Dim s As String
Console.WriteLine(“————————NameValueCollection “ & _
“example——————————”)
oNVC.Add(“000-00-0001”, “Mother Goose”)
oNVC.Add(“000-00-0002”, “The Frugal Gourmet”)
oNVC.Add(“000-00-0003”, “Pokeman Master”)
oNVC.Add(“000-00-0004”, “Simpsons Compendium”)
oNVC.Add(“000-00-0001”, “Real Estate Tycoons”)
Console.WriteLine(oNVC.Item(“000-00-0001”))
Console.WriteLine(“enumerate the keys“ & _
“(notice how duplicates are handled)”)
For Each s In oNVC.AllKeys
Console.WriteLine(“—— key “ & s & “ ———-”)
Cons
```
0
0
复制全文
相关推荐










