以下代码是我设计的队列处理服务器。
其功能是将并行数据保存到队列缓存中,然后由统一的线程来处理提交的目的。
其设计目的是缓解数据库服务器处理压力
目前该队列处理组件已经投入使用,欢迎大家的点评。
'队列服务器
Public MustInherit Class SequenceServer
#Region "字段申明"
Protected _dataList As New ArrayList(256)
Protected _t As Thread '当前线程的引用
Protected _stopflag As Boolean = False '停止挂起执行的标记
#End Region
'队列数据处理
'处理完成后,将数据从队列中移出
'如果该队列中的对象没有执行IDispose接口,那么重写该接口
Protected Overridable Sub SequenceProcess()
Dim obj As IDisposable
While True
If Me._dataList.Count > 0 Then
Try
Me.DataProcess(Me._dataList(0))
obj = Me._dataList(0)
Me._dataList.RemoveAt(0)
If Not IsNothing(obj) Then obj.Dispose()
Catch ex As Exception
'如果DataProcess中出现异常,那么移出当前队列中的元素
obj = Me._dataList(0)
If Not IsNothing(obj) Then obj.Dispose()
Me._dataList.RemoveAt(0)
End Try
Else
'将线程挂起
If Not Me._stopflag Then Me._t.Suspend()
End If
End While
End Sub
'数据处理,该方法必须被override,以处理队列中的数据
Protected Overridable Function DataProcess(ByVal data As Object) As Boolean
End Function
'添加处理数据到队列
Public Sub Add(ByVal data As Object)
Me._dataList.Add(data)
If Me._t.ThreadState = ThreadState.Suspended Then Me._t.Resume()
End Sub
'初始化方法,开始队列数据的处理
Public Sub New()
Me._t = New Thread(AddressOf Me.SequenceProcess)
Me._t.Start()
End Sub
'终止当前执行线程
Public Function StopProcess() As Boolean
'判断当前的队列处理线程是否已经挂起
'如果挂起:那么从新启动该线程,并将_stopflag=true来防止在DataProcess中将其再次置为挂起
'关闭队列处理线程
If Me._t.ThreadState = ThreadState.Stopped Then Return True
If Me._t.ThreadState = ThreadState.Suspended Then
Me._stopflag = True
Me._t.Resume()
Me._t.Abort()
Return True
Else
Return False
End If
End Function
'获取当前队列中数据的数量
Public ReadOnly Property DataCount() As Int32
Get
Return Me._dataList.Count
End Get
End Property
End Class