Apariencia
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.