using System.Diagnostics;
using System.Threading.Tasks;
public static void Main()
var stopwatch = Stopwatch.StartNew();
var taskEmailageData = CreateFakeTask("EmailageData", cost: 5, slaWatch: stopwatch);
var taskOthers = CreateFakeTask("OtherData", cost: 5, slaWatch: stopwatch);
Task.WaitAll(new[]{taskEmailageData, taskOthers}, TimeSpan.FromSeconds(3));
Console.WriteLine(stopwatch.ElapsedMilliseconds);
Console.WriteLine(taskEmailageData.Status);
private static Task CreateFakeTask(string taskName, int cost, Stopwatch slaWatch)
return Task.Factory.StartNew(() =>{
Console.WriteLine($"{taskName} fakeTask start: {slaWatch.ElapsedMilliseconds}ms");
var innerTask = Task.Factory.StartNew(async() =>{
Console.WriteLine($"{taskName} innerTask start: {slaWatch.ElapsedMilliseconds}ms");
await Task.Delay(TimeSpan.FromSeconds(cost));
Console.WriteLine($"{taskName} innerTask end: {slaWatch.ElapsedMilliseconds}ms");
}, TaskCreationOptions.LongRunning).Unwrap();
Console.WriteLine($"{taskName} innerTask.Wait start: {slaWatch.ElapsedMilliseconds}ms");
Console.WriteLine($"{taskName} innerTask.Wait end: {slaWatch.ElapsedMilliseconds}ms");
Console.WriteLine($"{taskName} fakeTask end: {slaWatch.ElapsedMilliseconds}ms");
}, TaskCreationOptions.LongRunning);