Netzwerkkommunikation unter .NET Core

  • VB.NET

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von wolfi_bayern.

    Netzwerkkommunikation unter .NET Core

    Hallo!

    Ich habe eine Frage bezüglich der Netzwerkkommunikation

    Am Client beginnt das ganze ja mit

    VB.NET-Quellcode

    1. _dlgReadCommandCode = AddressOf ReadCommandCode
    2. _dlgReadCommandCode.BeginInvoke(AddressOf EndReadCommandCode, Nothing)


    um später in der Funktion EndReadCommandCode mit

    VB.NET-Quellcode

    1. _dlgReadCommandCode.BeginInvoke(AddressOf EndReadCommandCode, Nothing)

    zu enden.

    Das funktioniert am PC mit .NET Framework soweit auch ganz gut. Problematisch wird es jedoch das ganze unter .NET Core einzusetzen, da hier BeginInvoke nicht mehr unterstützt wird.

    Jetzt hab ich sogar eine Anleitung gefunden wo genau auf dieses Thema eingegangen wird: devblogs.microsoft.com/dotnet/…nvoke-calls-for-net-core/

    Leider schaffe ich es nicht das ganze passend umzusetzen.

    Ich habe das ganze folgendermaßen bereits umgeschrieben:

    VB.NET-Quellcode

    1. Delegate Function CommandGetter() As UInt16
    2. Private commandGetter As CommandGetter
    3. Private _dlgReadCommandCode As Task(Of UInt16)
    4. Public _ID As Nullable(Of Integer) = Nothing
    5. Private _CommandCode As UInt16 = New UInt16()
    6. Private _CmdBuf As Byte() = New Byte(1) {}
    7. Public Sub New(ByVal TC As TcpClient, ByVal Optional id As Integer? = Nothing)
    8. _ID = id
    9. TcpClient = TC
    10. Dim strm = TcpClient.GetStream()
    11. ReadStream = New StreamContainer(strm)
    12. WriteStream = New StreamContainer(strm)
    13. commandGetter = ReadCommandCode
    14. _dlgReadCommandCode = Task.Run(Function() commandGetter.Invoke())
    15. _dlgReadCommandCode.ContinueWith(EndReadCommandCode)
    16. End Sub



    Auch die Funktion EndReadCommandCode hab ich angepasst:

    VB.NET-Quellcode

    1. Private Sub EndReadCommandCode(ByVal ar As Task(Of UInt16))
    2. If IsDisposed Then Return
    3. _CommandCode = ar.Result
    4. Console.WriteLine($"Received command: {_CommandCode.ToString()}")
    5. If _CommandCode = SetIdCommand Then
    6. Console.WriteLine("SetIDCommand received")
    7. If _ID.HasValue Then Console.WriteLine("ID set double")
    8. Dim buf As Byte() = New Byte(3) {}
    9. ReadStream.Read(buf, 0, 4)
    10. _ID = BitConverter.ToInt32(buf, 0)
    11. Initialized?.Invoke(Me, EventArgs.Empty)
    12. Else
    13. DataReceived?.Invoke(Me, EventArgs.Empty)
    14. End If
    15. ReadStream.NextContent()
    16. _dlgReadCommandCode.ContinueWith(AddressOf EndReadCommandCode)
    17. End Sub


    beim erstmaligen Aufruf bekomme ich dan auch den passenden CommandCode welcher vom Server kommt. Am Ende wird auch die Funktion rekursiv aufgerufen. Doch leider fehlt dazwischen das lesen eines weiteren Commandos. Somit ist das Kommando immer das setzen der ID das wars dann.

    Mir ist nun überhaupt nicht klar, wie ich das ReadCommand aufrufen muss, damit dies auch im korrekten Thread behandelt wird. Aufrufen an sich klapp freilich, allerding gibts dann entweder einen ThreadFehler oder die Meldung dass der Thread schon beendet wurde.

    Evlt. kann jemand helfen.

    Danke

    ausgelagert aus TcpKommunikation + Networkstream ~VaporiZed
    Der Beitrag wurde aus 100% wiederverwendbaren Elektronen erstellt!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()