Чтение асинхронного сетевого потока

Я провел немало поисков и уверен, что близок к этому, но у меня проблемы, и я надеюсь, что кто-то может помочь.

У меня есть сканер штрих-кода Ethernet, который мне нужно постоянно слушать. Я пробовал использовать NetworkStream.Read в отдельном потоке, но потом обнаружил, что есть функция BeginRead для асинхронных сетевых потоков. Проблема в том, что я вообще не могу заставить его работать.

Вот код, который у меня есть:

Public Class ScannerConnect
    Private client As TcpClient
    Property server As String
    Property port As Int32 = 2005
    Private data As [Byte]()


    Sub Connect()
        Try
            client = New TcpClient(server, port)
        Catch e As ArgumentNullException
           Console.WriteLine("ArgumentNullException: {0}", e)
        Catch e As SocketException
            Console.WriteLine("SocketException: {0}", e)
        End Try
    End Sub 'Connect

    Sub ListenASync()
        stream = client.GetStream()
        data = New [Byte](256) {}
        stream.BeginRead(data, 0, data.Length, AddressOf ReadASync, stream)
    End Sub

    Private Sub ReadASync(ar As IAsyncResult)
        Dim buffer As Byte() = TryCast(ar.AsyncState, Byte())
        Dim bytesRead As Integer = stream.EndRead(ar)
        Dim message As String = Encoding.ASCII.GetString(buffer, 0, bytesRead)

        MsgBox(message)

        stream.BeginRead(buffer, 0, buffer.Length, AddressOf ReadASync, buffer)
    End Sub
End Class

Вылетает на тусклом сообщении As String = Encoding.ASCII.GetString(buffer, 0, bytesRead) с ошибкой Array не может быть null.

Любые идеи, что я делаю неправильно?


person Jonno    schedule 09.12.2013    source источник
comment
если TryCast завершится неудачно, Byte не будет нулевым/пустым, и, поскольку вы не проверяете его, вы получаете сообщение об ошибке   -  person Ňɏssa Pøngjǣrdenlarp    schedule 09.12.2013


Ответы (1)


Вы передали stream (a NetworkStream) в качестве параметра AsyncState для BeginRead().
Вы не можете привести его к Byte() в обратном вызове EndRead.

person SLaks    schedule 09.12.2013
comment
В будущем используйте отладчик, чтобы узнать, что является нулевым. - person SLaks; 09.12.2013