private async Task CreatePostAsync(Guid id, CreatePostRequest createPostRequest) { using (_logger.BeginScope($"Creating post for day {createPostRequest.DayNumber}")) { var sw = Stopwatch.StartNew(); var nextPostIdTask = _postsRepository.GetNextPostIdAsync(); var timeStamp = (int)(DateTime.UtcNow - DateTime.UnixEpoch).TotalSeconds; _logger.LogInformation($"timestamp for post = {timeStamp}"); var photoAttachments = new List <PhotoAttachment>(); var photoTasks = new List <Task>(); _logger.LogInformation($"# of photos to process = {createPostRequest.Photos.Count}"); for (var photoIndex = 0; photoIndex < createPostRequest.Photos.Count; photoIndex++) { var originalKey = $"posts/{timeStamp}/pa-original-{photoIndex}.jpg"; var mobileKey = $"posts/{timeStamp}/pa-mobile-{photoIndex}.jpg"; var previewKey = $"posts/{timeStamp}/pa-preview-{photoIndex}.jpg"; var photoAttachment = new PhotoAttachment(); var photoBytes = createPostRequest.Photos[photoIndex]; var originalResizeTask = ResizeAndUploadPhotoAsync(photoBytes, 2560, originalKey).ContinueWith(task => { photoAttachment.Width = task.Result.width; photoAttachment.Height = task.Result.height; photoAttachment.Src = task.Result.location; }); var mobileResizeTask = ResizeAndUploadPhotoAsync(photoBytes, 1280, mobileKey).ContinueWith(task => { photoAttachment.MobileSrc = task.Result.location; }); var previewResizeTask = ResizeAndUploadPhotoAsync(photoBytes, 640, previewKey).ContinueWith(task => { photoAttachment.PreviewSrc = task.Result.location; }); var index = photoIndex; var batchTask = Task.WhenAll(originalResizeTask, mobileResizeTask, previewResizeTask).ContinueWith(t => { _eventsMap[id].AddEvent($"Photo attachment #{index + 1} was processed."); }); photoTasks.Add(batchTask); photoAttachments.Add(photoAttachment); } await Task.WhenAll(photoTasks.Append(nextPostIdTask)); var post = new Post(nextPostIdTask.Result, createPostRequest.Text, createPostRequest.Hashtag, timeStamp, createPostRequest.DayNumber, createPostRequest.VideoUrl, photoAttachments); await _postsRepository.PutItemAsync(post); _logger.LogInformation($"post created within {(int) sw.ElapsedMilliseconds} ms"); _eventsMap[id].Complete(); } }