VB.Net Sockets Invoke - PullRequest
       19

VB.Net Sockets Invoke

0 голосов
/ 18 ноября 2011

Я использую vb.net 2010 и создал программу, которая использует сокеты для передачи данных между нашим сервером Windows и сервером Unix. Код был изначально взят из примера проекта Microsoft, поэтому я немного понимаю его.

Все было хорошо, пока у меня не возникла идея превратить программу в сервис. Команда Invoke недоступна из службы. Я думаю, что понимаю почему, но что более важно, как мне обойти это или исправить это?

' need to call Invoke before can update UI elements
    Dim args As Object() = {command, data}
    Invoke(_processInStream, args)

Кто-нибудь, пожалуйста, помогите мне отчаянно пытаться закончить эту программу, чтобы я мог двигаться дальше:)

Ниже приведена остальная часть класса, также есть класс сокетов сервера, но я не хотел усложнять ситуацию?

Public Class srvMain

' start the InStream code to receive data control.Invoke callback, used to process the socket notification event on the GUI's thread
Delegate Sub ProcessSocketCommandHandler(ByVal command As NotifyCommandIn, ByVal data As Object)
Dim _processInStream As ProcessSocketCommandHandler

' network communication
Dim WithEvents _serverPRC As New ServerSocket
Dim _encryptDataIn() As Byte
Dim myConn As SqlConnection
Dim _strsql As String = String.Empty

Protected Overrides Sub OnStart(ByVal args() As String)
    ' watch for filesystem changes in 'FTP Files' folder
    Watch()

    ' hookup Invoke callback
    _processInStream = New ProcessSocketCommandHandler(AddressOf ProcessSocketCommandIn)
    ' listen for Ultimate sending signatures
    _serverPRC.Start(My.Settings.listen_port_prc)
    myConn = New SqlConnection(My.Settings.Mill_SQL_Connect)
End Sub

Protected Overrides Sub OnStop()
    ' Add code here to perform any tear-down necessary to stop your service.
End Sub

' this is where we will break the data down into arrays
Private Sub processDataIn(ByVal data As Object)
    Try
        If data Is Nothing Then
            Throw New Exception("Stream empty!")
        End If

        Dim encdata As String

        ' decode to string and perform split(multi chars not supported)
        encdata = Encoding.Default.GetString(data)

        _strsql = encdata
        myConn.Open()
        Dim commPrice As New SqlCommand(_strsql, myConn)
        Dim resPrice As SqlDataReader = commPrice.ExecuteReader

        '********************************THIS MUST BE DYNAMIC FOR MORE THAN ONE NATIONAL
        If resPrice.Read = True And resPrice("ats" & "_price") IsNot DBNull.Value Then
            'If resPrice("ats" & "_price") Is DBNull.Value Then
            ' cannot find price so error
            'natPrice = ""
            'natAllow = 2
            'End If
            natPrice = resPrice("ats" & "_price")
            natAllow = resPrice("ats" & "_allow")
        Else
            ' cannot find price so error
            natPrice = ""
            natAllow = 2
        End If


        myConn.Close()
        ' substring not found therefore must be a pricing query
        'MsgBox("string: " & encdata.ToString)
        'natPrice = "9.99"

    Catch ex As Exception
        ErrHandle("4", "Process Error: " + ex.Message + ex.Data.ToString)
    Finally
        myConn.Close() ' dont forget to close!
    End Try
End Sub

'========================
'= ServerSocket methods =
'========================
' received a socket notification for receiving from Ultimate
Private Sub ProcessSocketCommandIn(ByVal command As NotifyCommandIn, ByVal data As Object)
    ' holds the status message for the command
    Dim status As String = ""
    Select Case command
        Case NotifyCommandIn.Listen
            'status = String.Format("Listening for server on {0} ...", CStr(data))
            status = "Waiting..."
        Case NotifyCommandIn.Connected
            'status = "Connected to Ultimate" ' + CStr(data)
            status = "Receiving..."
        Case NotifyCommandIn.Disconnected
            status = "Waiting..." ' disconnected from Ultimate now ready...
        Case NotifyCommandIn.ReceivedData
            ' store the encrypted data then process
            processDataIn(data)
    End Select
End Sub

' called from socket object when a network event occurs.
Private Sub NotifyCallbackIn(ByVal command As NotifyCommandIn, ByVal data As Object) Handles _serverPRC.Notify
    ' need to call Invoke before can update UI elements
    Dim args As Object() = {command, data}
    Invoke(_processInStream, args)
End Sub

Конечный класс

Любая помощь приветствуется Большое спасибо

1 Ответ

1 голос
/ 18 ноября 2011

Invoke является членом System.Windows.Forms.Form и используется для проверки того, что определенный метод вызывается в потоке пользовательского интерфейса. Это необходимо, если рассматриваемый метод касается элементов управления пользовательского интерфейса.

В этом случае похоже, что вы можете просто вызвать метод напрямую, т.е.

вместо

Dim args As Object() = {command, data}
Invoke(_processInStream, args)

Вы можете просто написать

ProcessSocketCommandIn(command, data)

Кроме того, в этом случае вы можете избавиться от _processInStream экземпляра делегата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...