Hallo!
Ich habe eine Frage bezüglich der Netzwerkkommunikation
Am Client beginnt das ganze ja mit
um später in der Funktion EndReadCommandCode mit
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:
Auch die Funktion EndReadCommandCode hab ich angepasst:
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
Ich habe eine Frage bezüglich der Netzwerkkommunikation
Am Client beginnt das ganze ja mit
um später in der Funktion EndReadCommandCode mit
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
- Delegate Function CommandGetter() As UInt16
- Private commandGetter As CommandGetter
- Private _dlgReadCommandCode As Task(Of UInt16)
- Public _ID As Nullable(Of Integer) = Nothing
- Private _CommandCode As UInt16 = New UInt16()
- Private _CmdBuf As Byte() = New Byte(1) {}
- Public Sub New(ByVal TC As TcpClient, ByVal Optional id As Integer? = Nothing)
- _ID = id
- TcpClient = TC
- Dim strm = TcpClient.GetStream()
- ReadStream = New StreamContainer(strm)
- WriteStream = New StreamContainer(strm)
- commandGetter = ReadCommandCode
- _dlgReadCommandCode = Task.Run(Function() commandGetter.Invoke())
- _dlgReadCommandCode.ContinueWith(EndReadCommandCode)
- End Sub
Auch die Funktion EndReadCommandCode hab ich angepasst:
VB.NET-Quellcode
- Private Sub EndReadCommandCode(ByVal ar As Task(Of UInt16))
- If IsDisposed Then Return
- _CommandCode = ar.Result
- Console.WriteLine($"Received command: {_CommandCode.ToString()}")
- If _CommandCode = SetIdCommand Then
- Console.WriteLine("SetIDCommand received")
- If _ID.HasValue Then Console.WriteLine("ID set double")
- Dim buf As Byte() = New Byte(3) {}
- ReadStream.Read(buf, 0, 4)
- _ID = BitConverter.ToInt32(buf, 0)
- Initialized?.Invoke(Me, EventArgs.Empty)
- Else
- DataReceived?.Invoke(Me, EventArgs.Empty)
- End If
- ReadStream.NextContent()
- _dlgReadCommandCode.ContinueWith(AddressOf EndReadCommandCode)
- 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“ ()