vb.net - 远程客户端引用对象时什么都不是
问题描述
我已经制作了几个使用 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 类有两个实例,一个用于服务器线程,另一个用于客户端线程(远程调用)。但是只有一个全局变量,两个线程都引用它。
我对这种情况感到困惑。我错过了一些应该很明显的东西吗?
解决方案
我的问题的最终原因是存在重复声明,这不会导致编译错误,因此没有引起注意。当我删除额外的声明时,所有奇怪的行为都消失了。
我怀疑不知何故,备用类的一个实例是自动实例化的,并且未初始化,有一个空队列和什么都没有的引用。但我不明白这是怎么回事。
推荐阅读
- node.js - 如何从 Cpanel 中删除我的 NodeJs 应用程序?
- php - 在 laravel 中发送电子邮件
- python - 如何在python opencv中识别带有里程表读数的闭合矩形轮廓?
- c# - 如何使用 Visual Studio 和 MSBuild 进行确定性构建?
- python - 从熊猫数据框创建滑动窗口组
- r - 朴素贝叶斯函数的下标越界错误
- php - 如何将输入文本值推送到jquery中的复选框值
- angular - 使用cdk滚动模块Angular 9实现无限滚动,但相对于视口?
- three.js - 将threejs生成的模型导出到3dmax和Archicad的简单方法是什么?
- c# - 单击按钮停止/启动定时器后,定时器停止工作