Hallo zusammen.
Ich habe eine .NET-Framework-DLL, die mir eine TCP-Verbindung aufbaut. Der problematische Teil davon lautet:
Eine Race-Condition wird also gestartet. Wenn der Client sich mit dem Server verbinden kann, ist alles gut, ansonsten (nach 5 Sekunden) eben nicht -> Fehlermeldung
Ich habe also eine DLL-Methode X, die den o.g. Code enthält.
Das komische/Problem ist:
Wenn ich X von einem .NET 6-Projekt ausführe, hat
Wenn ich X von einem .NET-FX 4.8-Projekt ausführe, hat
Was mache ich falsch?
Hintergrund: Ich will ein .NET-FX-Projekt nach .NET 6 portieren.
Vielleicht versteh ich bis heute Tasks einfach nicht richtig.
##########
Es ist kein Problem der DLL. Wenn ich den Code in einem neuen Projekt erstelle, ist das Verhalten auch vom Projekttyp abhängig.
.NET ->
.NET-FX ->
Ich habe eine .NET-Framework-DLL, die mir eine TCP-Verbindung aufbaut. Der problematische Teil davon lautet:
VB.NET-Quellcode
Eine Race-Condition wird also gestartet. Wenn der Client sich mit dem Server verbinden kann, ist alles gut, ansonsten (nach 5 Sekunden) eben nicht -> Fehlermeldung
Ich habe also eine DLL-Methode X, die den o.g. Code enthält.
Das komische/Problem ist:
Wenn ich X von einem .NET 6-Projekt ausführe, hat
ConnectionTask
nach Zeile#3 den Status WaitForActivation
, der Task wurde also nicht gestartet.Wenn ich X von einem .NET-FX 4.8-Projekt ausführe, hat
ConnectionTask
nach Zeile#3 den Status RanToCompletion
, der Task wurde also gestartet.Was mache ich falsch?
Hintergrund: Ich will ein .NET-FX-Projekt nach .NET 6 portieren.
Vielleicht versteh ich bis heute Tasks einfach nicht richtig.
##########
Es ist kein Problem der DLL. Wenn ich den Code in einem neuen Projekt erstelle, ist das Verhalten auch vom Projekttyp abhängig.
VB.NET-Quellcode
- Imports System.Net.Sockets
- Imports System.Threading.Tasks
- Public Class Form1
- Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
- Dim Client = New TcpClient
- Dim ConnectionTask = Client.ConnectAsync(MeinPcName, PortDerGegenstelle).ContinueWith(Sub(x) If x.IsFaulted Then Client.Dispose(), TaskContinuationOptions.ExecuteSynchronously)
- Dim TimeoutTask = Task.Delay(5000).ContinueWith(Sub(x) Client.Dispose())
- Task.WhenAny(ConnectionTask, TimeoutTask).Wait()
- Stop
- End Sub
- End Class
.NET ->
WaitForActivation
, also: Task wurde nicht gestartet.NET-FX ->
RanToCompletion
, also: Task wurde gestartetDieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.
Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „VaporiZed“ ()