async Task SnsPublisher(IEnumerable <PublishRequest> publishRequests, TimeSpan duration, CancellationToken cancellationToken) { var publishTime = duration / publishRequests.Count(); var sw = Stopwatch.StartNew(); var scheduler = new TaskSchedulingInterval(); foreach (var r in publishRequests) { scheduler.Start(); await _snsClient.Value.PublishAsync(r, cancellationToken); await scheduler.WaitFor(publishTime, cancellationToken); } _details($"[VERBOSE] Requested {publishRequests.Count()} invocations in {sw.Elapsed}"); }
public async Task Handle(SNSEvent snsEvent, ILambdaContext context) { var command = JsonConvert.DeserializeObject <LambdaRequest <TJourney> >(snsEvent.Records[0].Sns.Message); var journeyReporter = new CloudWatchLogReporter <TJourney, TJourneyResult>(context.Logger); var executionInterval = command.Duration / command.RequestCount; var scheduler = new TaskSchedulingInterval(); var endOfStep = new CancellationTokenSource(); var endOfStepDuration = command.Duration + (command.Duration / 10); endOfStep.CancelAfter(endOfStepDuration); var endOfStepTask = Task.Delay(endOfStepDuration, endOfStep.Token); try { var pendingTasks = new List <Task>(); for (var i = 0; i < command.RequestCount; i++) { scheduler.Start(); pendingTasks.Add(FireAndForgetJourneyWithLowMemoryStateDelegste(_journeyTaker, command, journeyReporter, i, endOfStep.Token)); await scheduler.WaitFor(executionInterval, endOfStep.Token); } var firstTask = await Task.WhenAny(Task.WhenAll(pendingTasks), endOfStepTask); journeyReporter.ReportFinished(firstTask == endOfStepTask ? CompletionState.Timeout : CompletionState.Success); } catch (Exception e) { journeyReporter.ReportFinished(CompletionState.Error, e); } }