我制作了多个可以使用Windows Remoting进行通信的VB应用程序,但这是我第一次遇到此问题。
我的项目中有两个程序,一个客户端和一个服务器。服务器程序有一个队列。客户端程序通过调用服务器方法将项目添加到队列中。但是,当服务器程序检查队列时,该队列为空。
此外,服务器程序实例化了几个类,但是当客户端尝试使用它们时,它将发现它们为Nothing。因此,这是一个普遍的问题,而不仅仅是队列本身的问题。
我过去曾经有过线程问题的经验,所以我认为这是某种线程问题。我尝试使用委托函数,但这没有帮助。
这是一段代码,用以说明问题出现的位置。我很抱歉不知道如何正确格式化,这是我的第一次尝试。
' ====================================================================
' this class is instantiated on the server at startup time
Public Class CPAutoDispatcher
' EXAMPLE #1
Public mWLQueue As New Collection
' This function is called from the remote client using Windows Remoting
Public Function SendWorkList(ByVal theList As String) As Boolean
Dim objWL As New AutoWorkList
If Not parseWorkList(theList, objWL) Then Exit Function
Call mWLQueue.Add(objWL)
SendWorkList = True
End Function
' This function is called from the server
Public Sub Tick()
If mWLQueue.Count = 0 Then Exit Sub ' <-- THIS ALWAYS EXITS!
Dim objWL As AutoWorkList = mWLQueue.Item(1)
Call mWLQueue.Remove(1)
' ... do something with objWL ...
End Sub
' EXAMPLE #2
Private mServerReports() As CPAutoServerReport
Private mDelGNR As DEL_GetNewReport = AddressOf getNewReportDelegate
' This function is called from the server
Public Function ProcessMessage(objSR As CPAutoServerReport) As Boolean
If mServerReports Is Nothing Then
ReDim mServerReports(0)
mServerReports(0) = objSR
Else
' ... do something else ...
End If
End Function
' This function is called from the remote client using Windows Remoting
Public Function GetNewReport() As CPAutoServerReport
GetNewReport = mDelGNR.Invoke
End Function
Private Function getNewReportDelegate() As CPAutoServerReport
If mServerReports Is Nothing Then Exit Function ' <-- THIS ALWAYS EXITS!
' ... do something with mServerReports ...
End Function
End Class
' ================================================================
示例1:其他项目中的类似代码也可以使用,因此我希望服务器和客户端都可以访问mWLQueue和mServerReports。但事实并非如此。客户端找到mWLQueue,但它为空。
示例2:如果这仅仅是一个线程问题,我希望委托能够正确处理。但事实并非如此。客户端发现即使已设置mServerReports也不是。
我的代码表现为好像我的CPAutoDispatcher类有两个实例,一个实例用于服务器线程,另一个实例用于客户端线程(远程调用)。但是只有一个全局变量,两个线程都引用了该变量。
我对这种情况感到困惑。我是否缺少一些显而易见的东西?
答案 0 :(得分:0)
我遇到问题的最终原因是重复声明的存在,这些声明没有引起编译错误,因此没有引起注意。当我删除多余的声明时,所有奇怪的行为都消失了。
我怀疑以某种方式自动地实例化了替代类的实例,并且未对其进行初始化,该实例的空队列和引用均为Nothing。但是我不知道那是怎么回事。