using System.Threading.Tasks;
private static int counter = 0;
public static void Main()
Random rnd = new Random();
var tasks = new Task<object>[]
CreateTask(rnd.Next(500,2000)).ContinueWith(t => (object)t.Result),
CreateOtherTask(rnd.Next(500,2000)).ContinueWith(t => (object)t.Result),
CreateTask(rnd.Next(500,2000)).ContinueWith(t => (object)t.Result),
CreateOtherTask(rnd.Next(500,2000)).ContinueWith(t => (object)t.Result),
Task.Run(() => (object)CreateSimple()),
Task.Run(() => (object)CreateMessage()),
Task.Run(() => (object)CreateSimple()),
Task.Run(() => (object)CreateMessage())
Console.WriteLine(t.Result);
var all = Task.WhenAll(tasks).Result;
foreach(var result in all)
Console.WriteLine(result);
private static string CreateSimple()
int id = Program.counter++;
return "Task [" + id + "] delayed: NONE";
private static Message CreateMessage()
return new Message(CreateSimple());
private static async Task<string> CreateTask(int delay)
int id = Program.counter++;
return "Task [" + id + "] delayed: " + delay;
private static async Task<Message> CreateOtherTask(int delay)
int id = Program.counter++;
return new Message("Task [" + id + "] delayed: " + delay);
public Message(string msg) { message = msg; }
public override string ToString(){ return message; }