private async Task CreateAndFillBucket(int numberOfObjects) { bool exists = await client.BucketExistsAsync(sourceBucket); List <PutObjectResponse> fails = new List <PutObjectResponse>(); if (!exists) { PutBucketRequest newBucket = new PutBucketRequest() { BucketName = sourceBucket, BucketRegion = S3Region.US }; PutBucketResponse response = await client.PutBucketAsync(newBucket); } Random rand = new Random(); List <Task <PutObjectResponse> > tasks = new List <Task <PutObjectResponse> >(); int totalJobs = numberOfObjects / 100; if (totalJobs == 0) { totalJobs = 1; } for (int i = 0; i < totalJobs; i++) { int files = (i == totalJobs - 1 ? (numberOfObjects % 100 == 0 ? 100 : numberOfObjects % 100) : 100); for (int j = 0; j < files; j++) { int size = rand.Next(MIN_SIZE_128KB, MAX_SIZE_10MB); byte[] contents = new byte[size]; rand.NextBytes(contents); PutObjectRequest put = new PutObjectRequest() { BucketName = sourceBucket, Key = Guid.NewGuid().ToString(), StorageClass = S3StorageClass.OneZoneInfrequentAccess, ContentType = "application/octet-stream", AutoCloseStream = true, TagSet = new List <Tag>() { new Tag() { Key = "owner", Value = Environment.UserName } }, InputStream = new MemoryStream(contents) }; tasks.Add(client.PutObjectAsync(put)); } try { int counter = 0; foreach (Task <PutObjectResponse> response in tasks.Interleaved()) { counter++; if (response.Result.HttpStatusCode != HttpStatusCode.OK) { fails.Add(response.Result); } } tasks.Clear(); tasks = new List <Task <PutObjectResponse> >(); GC.Collect(); if (counter != files) { } } catch (Exception e) { } } }