首页 > 解决方案 > 远程客户端引用对象时什么都不是

问题描述

我已经制作了几个使用 Windows Remoting 进行通信的 VB 应用程序,但这是我第一次遇到这个问题。

我的项目中有两个程序,一个客户端和一个服务器。服务器程序有一个队列。客户端程序通过调用服务器方法将项目添加到队列中。但是当服务器程序检查队列时,它是空的。

此外,服务器程序实例化了几个类,但是当客户端尝试使用它们时,它发现它们什么都不是。所以这是一个普遍的问题,而不仅仅是队列本身的问题。

我过去曾遇到过线程问题,所以我认为这是某种线程问题。我尝试使用委托函数,但这没有帮助。

下面是一段代码来说明问题出现在哪里。很抱歉不知道如何正确格式化,这是我的第一次尝试。

'  ====================================================================
'  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 Is Nothing,即使它已设置。

我的代码表现得好像我的 CPAutoDispatcher 类有两个实例,一个用于服务器线程,另一个用于客户端线程(远程调用)。但是只有一个全局变量,两个线程都引用它。

我对这种情况感到困惑。我错过了一些应该很明显的东西吗?

标签: vb.net

解决方案


我的问题的最终原因是存在重复声明,这不会导致编译错误,因此没有引起注意。当我删除额外的声明时,所有奇怪的行为都消失了。

我怀疑不知何故,备用类的一个实例是自动实例化的,并且未初始化,有一个空队列和什么都没有的引用。但我不明白这是怎么回事。


推荐阅读