public static List <HerculesEvent>[] ReadEvents( this IHerculesStreamClient client, string stream, int count, int limit, int clientShards, StreamCoordinates coordinates = null) { var timeout = 30.Seconds(); var stopwatch = Stopwatch.StartNew(); var eventsRead = 0; var clientShardTasks = Enumerable.Range(0, clientShards).Select(ReadSingleClientShard); var events = Task.WhenAll(clientShardTasks).GetAwaiter().GetResult(); events.Sum(x => x.Count).Should().Be(count); return(events); async Task <List <HerculesEvent> > ReadSingleClientShard(int clientShard) { var shardEvents = new List <HerculesEvent>(); var readQuery = new ReadStreamQuery(stream) { Limit = limit, Coordinates = coordinates ?? StreamCoordinates.Empty, ClientShard = clientShard, ClientShardCount = clientShards }; while (stopwatch.Elapsed < timeout && eventsRead < count) { var result = await client.ReadAsync(readQuery, timeout); result.IsSuccessful.Should().BeTrue(); var eventsFromResponse = result.Payload.Events; shardEvents.AddRange(eventsFromResponse); readQuery.Coordinates = result.Payload.Next; Interlocked.Add(ref eventsRead, eventsFromResponse.Count); await Task.Delay(100); } return(shardEvents); } }
public async Task <ReadStreamResult <HerculesEvent> > ReadAsync(ReadStreamQuery query, TimeSpan timeout, CancellationToken cancellationToken = default) { var result = await client.ReadAsync(query, timeout, cancellationToken).ConfigureAwait(false); return(result.ToGenericResult()); }
public static ReadStreamResult Read( [NotNull] this IHerculesStreamClient client, [NotNull] ReadStreamQuery query, TimeSpan timeout, CancellationToken cancellationToken = default) => client.ReadAsync(query, timeout, cancellationToken).GetAwaiter().GetResult();