using System.Diagnostics;
using System.Threading.Tasks;
public static void Main()
Console.WriteLine($"Main Thread Id: {Thread.CurrentThread.ManagedThreadId:00}");
RunTasks_UsingNewStartWait();
RunTasks_UsingRunWaitAll();
RunTasks_UsingParallelInvoke();
private static void RunThreads()
Thread[] threads = new Thread[10];
var stopWatch = new Stopwatch();
var elapsed = new TimeSpan();
Console.WriteLine("\nRunning Threads...");
for (int i = 0; i < threads.GetLength(0); i++)
threads[i] = new Thread(() => Worker_ConstantWorkLoad(x + 1));
for (int i = 0; i < threads.GetLength(0); i++)
for (int i = 0; i < threads.GetLength(0); i++)
elapsed = stopWatch.Elapsed;
Console.WriteLine($"All Threads Completed {elapsed.Milliseconds}ms");
private static void RunTasks_UsingNewStartWait()
Task[] tasks = new Task[10];
var stopWatch = new Stopwatch();
var elapsed = new TimeSpan();
Console.WriteLine("\nRunning Tasks Using New, Start, and Wait...");
for (int i = 0; i < tasks.GetLength(0); i++)
tasks[i] = new Task(() => Worker_ConstantWorkLoad(x + 1));
for (int i = 0; i < tasks.GetLength(0); i++)
for (int i = 0; i < tasks.GetLength(0); i++)
elapsed = stopWatch.Elapsed;
Console.WriteLine($"All Tasks Completed {elapsed.Milliseconds}ms");
private static void RunTasks_UsingRunWaitAll()
Task[] tasks = new Task[10];
var stopWatch = new Stopwatch();
var elapsed = new TimeSpan();
Console.WriteLine("\nRunning Tasks using Run and WaitAll...");
for (int i = 0; i < tasks.GetLength(0); i++)
tasks[i] = Task.Run(() => Worker_ConstantWorkLoad(x + 1));
elapsed = stopWatch.Elapsed;
Console.WriteLine($"All Tasks Completed {elapsed.Milliseconds}ms");
private static void RunTasks_UsingParallelInvoke()
Action[] tasks = new Action[10];
var stopWatch = new Stopwatch();
var elapsed = new TimeSpan();
Console.WriteLine("\nRunning Tasks using Parallel Invoke...");
for (int i = 0; i < tasks.GetLength(0); i++)
tasks[i] = () => Worker_ConstantWorkLoad(x + 1);
elapsed = stopWatch.Elapsed;
Console.WriteLine($"All Tasks Completed {elapsed.Milliseconds}ms");
private static void Worker_ConstantWorkLoad(int workerId)
Console.WriteLine($"Worker {workerId:00} Thread Id {Thread.CurrentThread.ManagedThreadId:00}: Running...");
var stopWatch = new Stopwatch();
var ts = stopWatch.Elapsed;
Console.WriteLine($"Worker {workerId:00} Thread Id {Thread.CurrentThread.ManagedThreadId:00}: Done {ts.Milliseconds}ms");
private static Random random = new Random();
private static void Worker_VariableWorkLoad(int workerId)
Console.WriteLine($"Worker {workerId:00} Thread Id {Thread.CurrentThread.ManagedThreadId:00}: Running...");
var stopWatch = new Stopwatch();
Thread.Sleep(random.Next(1,10) * 10);
var ts = stopWatch.Elapsed;
Console.WriteLine($"Worker {workerId:00} Thread Id {Thread.CurrentThread.ManagedThreadId:00}: Done {ts.Milliseconds}ms");