【问题标题】:vb.net passing variables in shared subsvb.net 在共享 subs 中传递变量
【发布时间】:2012-04-23 00:14:27
【问题描述】:
Public Shared _formRef As frmMain
Public Shared f As frmMain

    Class Server
        <STAThread()> Public Shared Sub Main()
            Dim aTcpMessaging As IMessagingSystemFactory = New TcpMessagingSystemFactory()
            Dim anInputChannel As IInputChannel = aTcpMessaging.CreateInputChannel(theIPforLocal & ":" & thePort)
            Dim aStringMessagesFactory As IStringMessagesFactory = New StringMessagesFactory()
            Dim aStringMessageReceiver As IStringMessageReceiver = aStringMessagesFactory.CreateStringMessageReceiver()
            AddHandler aStringMessageReceiver.MessageReceived, AddressOf StringMessageReceived

            aStringMessageReceiver.AttachInputChannel(anInputChannel)
        End Sub

        Private Shared Sub StringMessageReceived(ByVal sender As Object, ByVal e As StringMessageEventArgs)
            _formRef = f

            LANResponse = Convert.ToString(e.Message)
            Dim lanSent As String() = Nothing
            Dim sep(3) As Char
            Dim s As String = ""

            sep(0) = "~"
            'sep(1) = ","
            lanSent = LANResponse.Split(sep, 2)

            Dim a As New Threading.Thread(AddressOf getStatus)

            a.SetApartmentState(Threading.ApartmentState.STA)
            a.Start(Trim(lanSent(0)) & Trim(lanSent(1)))
   End Sub
End Class

Class Sending
        Public Shared Sub Main(ByRef whatToWrite As String)
            Dim aTcpMessaging As IMessagingSystemFactory = New TcpMessagingSystemFactory()
            Dim anOutputChannel As IOutputChannel = aTcpMessaging.CreateOutputChannel(theIPforVM & ":" & thePort)
            Dim aStringMessagesFactory As IStringMessagesFactory = New StringMessagesFactory()
            Dim aStringMessageSender As IStringMessageSender = aStringMessagesFactory.CreateStringMessageSender()

            aStringMessageSender.AttachOutputChannel(anOutputChannel)
            aStringMessageSender.SendMessage(whatToWrite)
        End Sub
End Class

    Private Shared Sub getStatus(ByVal data As Object)
        _formRef.UpdateLabelText("Static: " & data)
    End Sub

    Public Sub UpdateLabelText(ByVal text As String)
        If Me.lblStatus.InvokeRequired Then
            Me.lblStatus.Invoke(New Action(Of String)(AddressOf UpdateLabelText), New Object() {text})
        Else
            Me.lblStatus.Text = text
        End If
    End Sub

#Region "Form Load"
    <STAThread()> Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Call Server.Main()
        '--------------------------------
        isTesting = False
        lblVer.Text = "V.7"
        '--------------------------------
    End Sub
#End Region

但是一旦启动代码,我就会收到您在附加图片中看到的错误

但奇怪的是,我确实传递了我正在寻找的值:

【问题讨论】:

    标签: vb.net multithreading parameters invoke address-operator


    【解决方案1】:

    您永远不会将 frmMain 的运行实例分配给共享变量。

    如果您将 Server Main 方法更改为:

        <STAThread()> Public Shared Sub Main(formRef As frmMain)
            f = FormRef
    

    然后将您对该方法的调用更改为:

    Call Server.Main(Me)
    

    那么这应该可以解决您的问题(假设 Server.Main 是从 frmMain 调用的)。

    【讨论】:

    • 您介意告诉我您在上面解释的内容吗?程序启动时,frmMain 已经显示出来了。
    • 抱歉,将 Main 方法名称误读为应用程序的入口点。我已经修改了我的回复,以表明我认为你需要做的事情。
    • 刚刚进行了这些更改,但我仍然在同一行上遇到相同的错误。
    • 我试图发送的消息将来自 StringMessageReceived 子而不是 主子
    • 好的,我将 _formRef = f 更改为 _formRef = formRef 并且成功了。
    猜你喜欢
    • 2017-11-01
    • 1970-01-01
    • 2021-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多