Skip to content

Leer desde varios consumidores ​

AsyncEnumerableResult<T> permite obtener varios enumeradores. Lo que recibe cada uno depende de la fuente.

csharp
using Greencore.Platform.Errors;
using Greencore.Platform.Results;

await using var resultado = AsyncEnumerableResult<int>.Ok(GenerarAsync());
await Task.WhenAll(LeerAsync("A", resultado), LeerAsync("B", resultado));

static async IAsyncEnumerable<int> GenerarAsync()
{
    for (var numero = 1; numero <= 2; numero++)
    {
        await Task.Yield();
        yield return numero;
    }
}
static async Task LeerAsync(string nombre, IAsyncEnumerable<int> valores)
{
    await foreach (var valor in valores)
        Console.WriteLine($"{nombre}: {valor}");
}

Este iterador produce 1 y 2 para cada consumidor. El orden entre A y B puede variar.

Con varios lectores de Channel.Reader.ReadAllAsync(), los lectores compiten por los elementos del canal. El resultado no añade difusión, caché ni garantías de seguridad a la fuente original.

No hagas dos llamadas pendientes a MoveNextAsync() sobre el mismo enumerador: se rechaza la segunda. Para distribución explícita entre consumidores, usa StreamHub.

Recuerda: varios enumeradores no implican que todos reciban todos los elementos.

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