using System.Collections;
using System.Collections.Generic;
using System.Threading.Tasks;
static async Task Main(string[] args) {
var links = await w.Start();
Console.WriteLine("Uploaded to cloud files URLs:");
foreach(var linkItem in links) {
Console.WriteLine(linkItem);
public async Task<IEnumerable<Uploaded>> Start() {
var proc = new ImageProcessor();
var resizedImages = proc.GetResizedImages("sourceFile.jpg");
var tasks = new List<Task<Uploaded>>();
foreach(var image in resizedImages) {
var uploadTask = Task.Run(async () => await proc.UploadImage(image));
await Task.WhenAll(tasks);
return tasks.Select(x => x.Result);
public IEnumerable<Resized> GetResizedImages(string fileName) {
for (var i = 0; i < 10; i++) {
Console.WriteLine($"Start resize image {i}");
var rand = new Random(DateTime.UtcNow.Millisecond);
Task.Delay(rand.Next(100, 400)).Wait();
yield return new Resized(i);
public async Task<Uploaded> UploadImage(Resized image) {
Console.WriteLine($"Start upload image {image.Index}");
var rand = new Random(DateTime.UtcNow.Millisecond);
await Task.Delay(rand.Next(400, 700));
return new Uploaded(image.Index);
public Resized(int index) {
public int Index { get => stream; }
public override string ToString() {
return $"{nameof(Resized)} file - STREAM: {stream}";
public Uploaded(int index) {
public int Index { get => url; }
public override string ToString() {
return $"{nameof(Uploaded)} file - URL: {url}";