using System.Threading.Tasks;
using System.ComponentModel;
using System.Diagnostics;
public static async void Main()
Console.Write("Enter an integer: ");
string input = Console.ReadLine();
if(!(Double.TryParse(input, out inputNumber)))
Console.WriteLine("\"{0}\" is not a number!", input);
Stopwatch stopwatch = new Stopwatch();
Task<double> task = new Task<double>(() => {
return WaitAndReturnSquaredDouble(inputNumber);
Console.WriteLine("Task status: {0}", task.Status);
WriteObjectPropertiesToConsole(task, stopwatch);
Console.WriteLine("Calculating...");
Console.WriteLine("Task status: {0}", task.Status);
if (task.Status == TaskStatus.Created)
Console.WriteLine("No calculation needed!");
outputNumber = inputNumber;
Console.WriteLine("Task status: {0}", task.Status);
WriteObjectPropertiesToConsole(task, stopwatch);
outputNumber = task.Result;
WriteObjectPropertiesToConsole(task, stopwatch);
Console.WriteLine(" {0} squared is {1}", inputNumber, outputNumber);
private static double WaitAndReturnSquaredDouble(double number)
return Math.Pow(2, number);
private static void WriteObjectPropertiesToConsole(object obj, Stopwatch stopwatch = null)
Console.WriteLine("---------------------------------");
foreach(PropertyDescriptor descriptor in TypeDescriptor.GetProperties(obj))
string name = descriptor.Name;
if (name == "Result") continue;
object value = descriptor.GetValue(obj);
Console.WriteLine("{0}={1}", name, value);
Console.WriteLine("*Elapsed time: {0}", stopwatch.ElapsedMilliseconds);
Console.WriteLine("---------------------------------");