Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 在类中而不是在窗体中使用invoke_Vb.net - Fatal编程技术网

Vb.net 在类中而不是在窗体中使用invoke

Vb.net 在类中而不是在窗体中使用invoke,vb.net,Vb.net,我编写了一个程序,读取com端口的信号,一切正常,但他们想让应用程序成为一个服务,所以我将应用程序类型切换为“windows服务”,创建了一个类,并将所有内容都放在表单中,然后在启动模块的Main()中调用该类。那条线, Me.Invoke(New myDelegate(AddressOf UPdateVariable), New Object() {}) 在类中,invoke用红色表示,“'invoke,不是weather.weather的成员。”,并且该行的“Me”部分不再像在表单中

我编写了一个程序,读取com端口的信号,一切正常,但他们想让应用程序成为一个服务,所以我将应用程序类型切换为“windows服务”,创建了一个类,并将所有内容都放在表单中,然后在启动模块的Main()中调用该类。那条线,

   Me.Invoke(New myDelegate(AddressOf UPdateVariable), New Object() {})
在类中,invoke用红色表示,“'invoke,不是weather.weather的成员。”,并且该行的“Me”部分不再像在表单中那样变灰。以前它起作用了,但我不知道是什么造成了不同

这是该类的全部代码

Imports System
Imports System.IO.Ports
Imports System.Net.Mime

Public Class Moisture
    Dim WithEvents serialPort As New IO.Ports.SerialPort
Public Delegate Sub myDelegate()
Public RawString As New System.Text.StringBuilder
Public value As String

Public Sub StartListening()
    If serialPort.IsOpen Then
        serialPort.Close()
    End If

    Try
        With serialPort
            .PortName = "COM3"
            .BaudRate = 9600
            .Parity = Parity.None
            .StopBits = StopBits.One
            .DataBits = 8
            .Handshake = Handshake.None
            .RtsEnable = True
        End With
        serialPort.Open()
    Catch ex As Exception

    End Try
End Sub

 Private Sub serialPort_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort.DataReceived
    Me.Invoke(New myDelegate(AddressOf UPdateVariable), New Object() {})

End Sub

Public Sub UPdateVariable()
    With RawString
        .Append(serialPort.ReadLine())
    End With
    If RawString.ToString().Count(Function(x As Char) x = "%"c) = 2 Then
        PiTagUpdater(StringParser(RawString.ToString()))
        RawString.Clear()
    End If
End Sub

Public Function StringParser(RawString As String) As String
    Dim Moisture = RawString
    Dim value As String
    Dim values As String() = Moisture.Split(New Char() {":"c})
    value = values(values.Length - 1).Trim({" "c, "%"c})
    Return value
End Function

Private Sub PiTagUpdater(Value As Decimal)


    Try
        Dim piserver As New PCA.Core.PI.PIServer(PCA.Core.Globals.Applications.Application("GENERAL").ConfigValues.ConfigValue("PI_SERVER_NAME").StringValue, PCA.Core.Globals.Applications.Application("GENERAL").ConfigValues.ConfigValue("PI_SERVER_UID").GetDeCryptedStringValue, PCA.Core.Globals.Applications.Application("GENERAL").ConfigValues.ConfigValue("PI_SERVER_PASSWD").GetDeCryptedStringValue, True)
        Dim TimeStamp As DateTime = FormatDateTime(Now)
        Dim RapidRingCrush = "M1:RapidRingCrush.T"
        Try
            piserver.WriteValue(RapidRingCrush, Value, TimeStamp)
        Catch ex As Exception
            MessageBox.Show("Error occured locating Pi Tag", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
            Application.Exit()
        End Try

    Catch ex As Exception
        MessageBox.Show("Cannot connect to Pi Server")
    End Try

    End Sub

End Class

Me
引用当前对象,在本例中是类的实例。您的类没有
Invoke()
方法(如错误所述),但是从
System.Windows.Forms.Control
派生的任何方法都有(例如
Form

用于将方法的执行移动到创建控件的同一线程。这用于实现线程安全

因为您切换到了服务,所以可以公平地假设您没有用户界面,因此不需要调用。删除
Invoke()
调用并手动调用该方法就足够了:

Private Sub serialPort_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort.DataReceived
    UPdateVariable()
End Sub

编辑:


正如LarsTech所说,您还必须将消息框切换到某种日志记录方法。Windows服务通常在不同的帐户下运行,这意味着它无法向当前用户显示用户界面。

并且这些消息框也需要转换为日志记录方法。@LarsTech:是的,没有想到它们。编辑。这有什么不好的,唐纳?我希望得到一些建设性的反馈。我将要使用的信息框。我知道服务没有UI,关于win forms包在类中使用的回答很好,但我不知道控件。调用用法,今天学到了一些东西这是一个非常有用和启发性的回答谢谢。@VisualEvent我不知道谁投了反对票,但我给了你一个肯定的票,所以至少是0。谢谢文森特