Skip to content

Cancelar una lectura asíncrona ​

Pasa el token con WithCancellation(token). La fuente debe observarlo para interrumpir una espera.

csharp
using Greencore.Platform.Errors;
using Greencore.Platform.Results;
using System.Runtime.CompilerServices;

using var detener = new CancellationTokenSource();
await using var resultado = AsyncEnumerableResult<int>.Ok(GenerarAsync());
try
{
    await foreach (var numero in resultado.WithCancellation(detener.Token))
    {
        Console.WriteLine(numero); // 1.
        await detener.CancelAsync();
    }
}
catch (OperationCanceledException) when (detener.IsCancellationRequested)
{
    Console.WriteLine("Lectura cancelada.");
}

static async IAsyncEnumerable<int> GenerarAsync([EnumeratorCancellation] CancellationToken token = default)
{
    for (var numero = 1; numero <= 3; numero++)
    {
        await Task.Delay(10, token);
        yield return numero;
    }
}

WithCancellation es una extensión de .NET para IAsyncEnumerable<T>, disponible mediante System.Threading.Tasks (incluido por los usings implícitos de una consola .NET).

El token afecta a ese enumerador. No cancela otros enumeradores con tokens diferentes ni cambia el estado inicial del resultado.

CancelAsync() espera los callbacks de cancelación; para esperar el trabajo de tus consumidores debes esperar también sus tareas.

Recuerda: cancelar solicita detener; esperar al consumidor confirma que terminó.

Siguiente: liberar los recursos.

Uso personal limitado. Uso comercial sujeto a autorización escrita.