Brechen Sie NetworkStream.ReadAsync mit TcpListener ab

Betrachten Sie das folgende vereinfachte Beispiel (einsatzbereit in LinqPad, Konto mit erhöhten Rechten erforderlich):

void Main()
{
    Go();
    Thread.Sleep(100000);
}
async void Go()
{
    TcpListener listener = new TcpListener(IPAddress.Any, 6666);
    try
    {
        cts.Token.Register(() => Console.WriteLine("Token was canceled"));
        listener.Start();
        using(TcpClient client = await listener.AcceptTcpClientAsync()
                                               .ConfigureAwait(false))
        using(var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5)))
        {
            var stream=client.GetStream();
            var buffer=new byte[64];
            try
            {
                var amtRead = await stream.ReadAsync(buffer,
                                                     0,
                                                     buffer.Length,
                                                     cts.Token);
                Console.WriteLine("finished");
            }
            catch(TaskCanceledException)
            {
                Console.WriteLine("boom");
            }
        }
    }
    finally
    {
        listener.Stop();
    }
}

Wenn ich einen Telnet-Client anschliesselocalhost:6666 und 5 Sekunden lang nichts tun, warum sehe ich "Token wurde storniert", aber nie "boom" (oder "beendet")?

Wird dieser NetworkStream die Kündigung nicht einhalten?

Ich kann das mit einer Kombination aus umgehenTask.Delay() undTask.WhenAny, aber ich würde es vorziehen, es wie erwartet zum Laufen zu bringen.

Umgekehrt das folgende Stornobeispiel:

async void Go(CancellationToken ct)
{
    using(var cts=new CancellationTokenSource(TimeSpan.FromSeconds(5)))
    {
        try
        {
            await Task.Delay(TimeSpan.FromSeconds(10),cts.Token)
                                        .ConfigureAwait(false);
        }
        catch(TaskCanceledException)
        {
            Console.WriteLine("boom");
        }
    }
}

Druckt wie erwartet "boom". Was ist los?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage